283.双指针—移动零
要在原地(不复制数组)将所有0移到末尾,且保持非零元素相对顺序,核心思路是:
1、双指针法:用两个指针(慢指针slow、快指针fast)遍历数组;
2、快指针fast负责遍历数组,找到所有非零元素;
3、慢指针slow负责记录“非零元素应该放置的位置”,将快指针找到的非零元素赋值到慢指针位置;
4、遍历完成后,慢指针(包括慢指针的位置,因为最后一趟放置好快指针的元素后,慢指针执行自增)之后的所有位置统一赋值为0。
这种方法只需遍历数组2次(一次找非零元素,一次补0),时间复杂度O(n),空间复杂度O(1),完全满足“原地操作”的要求。
关键代码实现如下:
void moveZeroes(vector
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,完成零移到末尾的要求。
浙公网安备 33010602011771号