文章目录
- 双指针算法
- 移动零
- 复写零
双指针算法
移动零
思路:通过定义两个下标作为双指针,cur从开始对整个数组进行遍历,而我们的dest代表的是非零元素的最后一个位置,cur位置为0的时候就cur++,不为0元素的时候就交换dest+1位置的元素和dest位置的元素,最后在cur++。
代码实现:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int dest=-1,cur=0;
for(cur=0;cur<nums.size();cur++)
{
if(nums[cur])
swap(nums[++dest],nums[cur]);
}
}
};
复写零
思路:根据双指针算法,我们需要两个指针来表示下标,dest为-1,cur为0,cur用来遍历整个数组。我们分为三步,先找出最后一个复写的数,我们就要用循环控制dest走的步数,如果arr[cur]不为空,dest走一步,为空dest走两步,当dest大于整个数组的长度是就结束循环,此时cur为最后一个复写的数的下标。由于从前往后复写会覆盖许多的数据,所以我们需要用到从后往前复写,当dest==n时的边界问题就将arr[n-1]==0,dest=dest-2,cur–来解决。
代码实现:
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
int dest = -1, cur = 0, n = arr.size();
while (cur < n)
{
if (arr[cur]) dest++;
else dest += 2;
if (dest >= n - 1) break;
cur++;
}
if (dest == n)
{
arr[n - 1] = 0;
cur--;
dest -= 2;
}
while (cur >= 0)
{
if (arr[cur]) arr[dest--] = arr[cur--];
else
{
arr[dest--] = 0;
arr[dest--] = 0;
cur--;
}
}
}
};