6

移动零

·2 分钟

🟢 Easy · 🏷️ 数组、双指针 · LeetCode#283

📖 题目

把数组里所有的 0 移到末尾,非零元素的相对顺序不变,必须原地修改。

输入输出
nums=[0,1,0,3,12][1,3,12,0,0]

💡 思路

快慢双指针:快指针遍历整个数组,遇到非零元素就放到慢指针的位置,慢指针再往前走一步。走完一遍后,slow 停在的位置往后全部填 0。

slow 始终指向"下一个非零元素该放的位置",fast - slow 就是目前遇到的 0 的个数。

这个模板后面会反复出现——移除元素、删除重复项都是它的变体,只是"保留条件"不一样。

💻 代码

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        slow = 0
        for fast in range(len(nums)):     # 把非零往前移
            if nums[fast] != 0:
                nums[slow] = nums[fast]
                slow += 1
        for i in range(slow, len(nums)):  # 后面填零
            nums[i] = 0

返回类型 -> None 说明要原地修改数组本身(nums[i] = x),不能写 nums = [...] 这种会创建新列表、函数外看不到变化的形式。

虽然有两次循环,但每个元素最多被访问两次,时间复杂度仍是 O(n),空间复杂度 O(1)。