双指针系列1 - 283. 移动零 和 1089. 复写零
283. 移动零题目:
思路分析:
所以大致思路:
1. 定义两个双指针cur(用来遍历数组),dest(最后一个非零元素的下标):
刚开始可以认为数组没有非零元素,那么dest=-1;
cur=0找到了第一个非零元素,dest++,cur++;
2.cur去找非零元素,找到了dest++,交换cur和dest的值;
3.没有找到cur++,dest不动;
代码实现:
class Solution {
public:void moveZeroes(vector<int>& nums) {int cur = 0;int dest = -1;for(cur=0;cur<nums.size();cur++){// 找到非零元素if(nums[cur]){swap(nums[++dest],nums[cur]);}}}
};
1089. 复写零题目:
思路分析:
代码实现:
class Solution {
public:void duplicateZeros(vector<int>& arr) {int cur = 0;int dest = -1;for (cur = 0; cur < arr.size(); cur++){if (arr[cur] == 0){dest += 2;}else{dest++;}if (dest >= arr.size()-1) //这里不要忘记dest=size()-1也要结束break;}if (dest == arr.size()){arr[arr.size()-1] = 0;cur--;dest -= 2;}while (cur >= 0){if (arr[cur]){arr[dest--] = arr[cur--];}else{arr[dest--] = 0;arr[dest--] = 0;cur--;}}}
};