第 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)。