283.双指针—移动零

要在原地(不复制数组)将所有0移到末尾,且保持非零元素相对顺序,核心思路是:

1、双指针法:用两个指针(慢指针slow、快指针fast)遍历数组;
2、快指针fast负责遍历数组,找到所有非零元素;
3、慢指针slow负责记录“非零元素应该放置的位置”,将快指针找到的非零元素赋值到慢指针位置;
4、遍历完成后,慢指针(包括慢指针的位置,因为最后一趟放置好快指针的元素后,慢指针执行自增)之后的所有位置统一赋值为0。

这种方法只需遍历数组2次(一次找非零元素,一次补0),时间复杂度O(n),空间复杂度O(1),完全满足“原地操作”的要求。

关键代码实现如下:

void moveZeroes(vector& nums) {
int slow=0;
int n=nums.size();

for(int fast=0;fast<n;fast++){
if(nums[fast]!=0){
nums[slow]=nums[fast];
slow++;
}
}
for(int i=slow;slow<n;slow++){
nums[slow]=0;
}
}

代码关键部分解释:
1、双指针遍历非零元素

fast指针逐个遍历数组元素:

  • 遇到非零元素:将其赋值给nums[slow],然后slow后移一位;
  • 遇到0:跳过(fast继续后移,slow不动)。

遍历结束后,nums[0...slow-1]存储了所有非零元素,且保持原有相对顺序。

2、补零操作
slow指针的位置是“最后一个非零元素的下一位”,从这个位置到数组末尾,全部赋值为0,完成零移到末尾的要求。

posted @ 2026-03-23 20:21  ZealousMclaren  阅读(12)  评论(0)    收藏  举报