2.LeetCode算法习题讲解--双指针--复写零

一.题目

习题链接:1089. 复写零 - 力扣(LeetCode)

二.题目分析

  1. 遍历数组时每遇到一个 0,就在原地额外复写一个 0;
  2. 原本 0 后面的所有元素整体向右平移;
  3. 硬性限制:绝对不能超出原数组长度写入数据,尾部多出来的元素直接舍弃;
  4. 必须原地修改,无返回值。

示例 1:arr = [1,0,2,3,0,4,5,0]

  1. 第一个 0:原地多写一个 0 → [1,0,0,2,3,0,4,5]
  2. 第二个 0:原地多写一个 0 → [1,0,0,2,3,0,0,4]
  3. 第三个 0 往后填充会越界,直接截断丢弃,最终结果:[1,0,0,2,3,0,0,4]

示例 2:数组没有 0,数组保持原样不变。

三.讲解算法原理

先进行异地操作:用两个数组进行模拟实现,然后在优化为就地操作

当cur遇到0下面这个数组就写两个0,遇到非0就把上面的数字给抄写下来

就地操作:

注意:如果将cur和dest从前进行向后复写的话,由于dest走的要比cur快,复写的时候会将原数组的元素给覆盖,所以该思路不成立,需要从后向前复写

如何从后向前复写呢?

分为两步;

第一步:先找到最后一个复写的数字

过程:

cur指向0,dest指向-1;如果cur指向的数字是非零,dest向前移动一步,如果是0,向前移动两步;然后判断dest是否走到数组末尾,最后让cur++

第二步:

"从后往前" 完成复写操作

过程:

cur指向的是非零,交换 cur 和 dest指向的数字,然后cur和dest都--

cur指向的是0,dest指向的位置给0,并且dest--后指向的位置也给0,然后cur和dest都--

但是为什么会报错,可以将数组写在纸上进行过程我们会发现dest越界了,这时赋值就会报错,所以注意:我们需要判段dest是否出现越界

这里只能这样写,可能会有人说为什么里面不用一行代码来写,不把dest = n - 1;

因为如果这样写了就会导致dest提前一步,跟正向寻找最后一位复写的过程不一样;我们要来怎么找最后一个复写数字,就要怎么回去,所以不能这样dest = n - 1;这样写只能按上述写法,怎么往后走就要怎么往前走

四.编写代码

cpp 复制代码
class Solution
{
public:
    void duplicateZeros(vector<int>& arr) 
    {
       int cur = 0,dest = -1,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--;
        }
       }
    }
};
相关推荐
H_BB6 分钟前
面试笔记:数据加密和心跳机制
笔记·面试·职场和发展
海绵宝宝转agent15 分钟前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
青少儿编程课堂24 分钟前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛
SZYSK1 小时前
OpenHarmony 上读卡、推理和双屏刷新抢 CPU:核验机与消费机的调度差
物联网·算法·harmonyos·1024程序员节
Ivanqhz1 小时前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节
lpfasd1232 小时前
推荐算法进化史
算法·机器学习·推荐算法
Pniubi2 小时前
力扣543二叉树的直径(深度优先搜索法(递归))
算法·leetcode·职场和发展
.道阻且长.2 小时前
Linux基本开发工具:编译器gcc/g++
linux·运维·服务器·职场和发展
Yuzhiyuxia13 小时前
【AI Agent面试系列】AI Agent记忆机制知识点1
人工智能·面试·职场和发展
UIU11413 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划