【算法】双指针(二)复写零
目录
一、题目介绍
二、双指针原理
1.当前维护指针
1.2维护要求
(1)不能覆盖掉未产效元素
三、提交代码
一、题目介绍
1089. 复写零 - 力扣(LeetCode)
二、双指针原理
扩容遍历指针、当前维护指针 从小维护到大
1.当前维护指针
1.1维护方向-双指针(一)移动零
1.2维护要求
(1)不能覆盖掉未产效元素
超前式覆盖 就从结果后位开始 往回 变回 在后追赶 逆序维护
三、提交代码
public void duplicateZeros(int[] arr) {//省去维护的覆盖 到结果后位,就成直接数步子了:int cur = 0;int dest = 0;while(dest < arr.length) {if(arr[cur] == 0) {dest += 2;}else {dest += 1;}cur++;}//从结果后位开始 往回在后追赶 逆序维护:if(dest == arr.length) {//两指针指向的 都是自然再向后移动到的,指向的 并未展开 对着覆值操作的,此时都往回一步就到 数组末尾操作值位置dest--;cur--;}if(dest > arr.length) {dest--;cur--;//两指针都往回移回一步后 就可以对着开始 往回覆值操作了,但这里dest指向的是越界处,得手动 覆值调一下arr[dest - 1] = arr[cur];//一定是之前cur指向了0的连续导致的,往回一步后的此时arr[cur]一定是0,连续覆两次dest -= 2;cur--;}while(cur >= 0) {if(arr[cur] == 0) {arr[dest] = 0;arr[dest-1] = 0;dest -= 2;}else {arr[dest] = arr[cur];dest--;}cur--;}
}