题目解析
移动零
nums = [0,1,0,3,12]
[1,3,12,0,0]
算法原理
数组划分(数组分块)
双指针算法(利用数组下标来充当指针)
使用两个指针的作用:
cur指针:从左往右扫描数组,就是遍历数组。
dest指针:已经处理之后的区间内,非零元素的最后一个位置
这两个指针将分隔为三个区间:
第一个:[0,dest]
第二个:[dest+1,cur-1]
第三个:[cur,n-1]
第一个:[0,dest] 非0元素
第二个:[dest+1,cur-1] 0元素
第三个:[cur,n-1] 未处理元素
[0,1,0,3,12]
当你遇到0元素的时候,只需要让cur向后移动一位即可
当你遇到非0元素的时候,需要让dest先去向后移动一位,然后交换dest与cur位置的元素,然后cur继续向后移动一位。
当cur遍历到n位置的时候,表示已经完成。
总结一下:
cur从前往后遍历的过程中,会有两种情况:
1.遇到0元素:cur++
2.遇到非0元素:
swap(dest+1,cur)
dest++,cur++
编写代码
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for(int cur = 0,dest = -1;cur<nums.size();cur++){
if(nums[cur]!=0){
swap(nums[++dest],nums[cur]);
}
}
}
};