283. 移动零
给定一个数组
nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。示例:
输入:[0,1,0,3,12]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
通过次数601,200提交次数939,210
法 1 双指针
思路
用两个指针维护三段区间

0 元素区域 是当前意义下的 0 元素区域,即已经把该区域的非0元移动到前面了,所以该区域可以置为0
判断条件如下:
# 遇到非 0 元素, 则把 非0元素区域进行拓宽,即 l += 1 nums[l] = nums[r] if nums[r] != 0: l += 1 nums[l] = nums[r]
最后把所有 0元素区间的值均置为 0
题解
class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ l, r = -1, 0 while r < len(nums): if nums[r] != 0: l += 1 nums[l] = nums[r] r += 1 # 将 l 后面的置为 0 l += 1 while l < len(nums): nums[l] = 0 l += 1 return nums # 优化:直接交换 0 与 非0元素 class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ l = -1 r = 0 while r < len(nums): if nums[r] != 0: l += 1 nums[l], nums[r] = nums[r], nums[l] r += 1
