双指针算法
1.算法题目(复写零)

注意:不要越界,不能开额外的数组,只能从现有数组上进行操作,没有返回值。
2.讲解算法原理
解法 :双指针操作
先根据"异地"操作,然后优化成双指针的"就地"操作。
- 先找到最后一个"复写"的数;
- 双指针算法
解释:用一个数组,让cur
指向下标为0的位置,让dest
指向下标为-1的位置,判断cur
指向的元素是否为零,不为零dest
向后移动一位,判断dest
是否移动到最后一位,没有就再次移动cur
一位,如果cur
指向的元素为零,就要dest
向后移动两位,再判断dest是否结束,结束就知道复写数组最后一个元素是什么。 - 先判断
cur
位置的值 - 决定
dest
向后移动一步或者两步 - 判断一下
dest
是否已经到结束为止 cur++
- 处理一下边界情况
因为dest
可能存在越界的情况
cpp
n-1=0;
cur--;
dest-=2;
- "从后向前"完成复写操作;
因为我们已经知道最后一个元素是什么了,"从后往前"复写也不会存在覆盖的情况。
3.编写代码
cpp
class Solution {
public:
void duplicateZeros(vector<int>& arr)
{
//1.先找最后一个元素
int cur = 0, dest = -1, n = arr.size();
while (cur < n)
{
if (arr[cur])dest++;
else dest += 2;
if (dest >= n - 1)break;
cur++;
}
//2.处理边界问题
if (dest == n)
{
arr[n - 1] = 0;
cur--; dest -= 2;
}
//3.从后向前完成复写
while (cur >= 0)
{
if (arr[cur])arr[dest--] = arr[cur--];
else
{
arr[dest--] = 0;
arr[dest--] = 0;
cur--;
}
}
}
};