【算法】活用双指针完成复写零操作

这篇具有很好参考价值的文章主要介绍了【算法】活用双指针完成复写零操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【算法】活用双指针完成复写零操作,# 双指针,算法

Problem: 1089. 复写零

题目解析

首先我们来分析一下本题的题目意思

  • 可以看到题目中给到了一个数组,意思是让我们将数组中的零元素都复写一遍,然后将其余的元素向后平移

【算法】活用双指针完成复写零操作,# 双指针,算法

  • 光就上面这样来看还是不太形象,我们通过画图来分析一下,通过下图我们可以看到,凡是0的都复写了两遍,凡不是0的都复写了一遍

【算法】活用双指针完成复写零操作,# 双指针,算法

  • 但是呢题目中很明显地讲到只能让我们在数组上进行就地操作,但是就我们上面的操作而言则是在另外开辟了一块数组的空间

那在下面我们就去考虑一下在数组原地的操作

  • 可以看到在下面我使用到了双指针的操作,若是cur遍历到0的话就进行两次的复写操作,不过呢大家可以看到在第一次的复写操作完成之后,【2】被覆盖了,但是这个【2】是我们需要的,那也就造成了一定的问题

【算法】活用双指针完成复写零操作,# 双指针,算法

💬 那么反应快的同学可以意识到,如果要进行覆盖操作的话就需要 从后往前 进行遍历操作才可以

算法原理分析

好,接下去呢我们就来分析一下解决本题的思路

找到最后一个复写的位置

  • 上面说到是要从后往前开始做复写操作,那么第一步我们所要做的就是找到最后一个复写的位置,即让这个dest指向最后的0

【算法】活用双指针完成复写零操作,# 双指针,算法

那要怎么去找呢?(头一次尝试幻灯片≧ ﹏ ≦)

可以分为以下几步:

  1. 判断cur位置的值,决定dest走一步还是两步
  2. 判断dest是否到达末尾,决定cur是否++

<【算法】活用双指针完成复写零操作,# 双指针,算法,【算法】活用双指针完成复写零操作,# 双指针,算法,【算法】活用双指针完成复写零操作,# 双指针,算法,【算法】活用双指针完成复写零操作,# 双指针,算法,【算法】活用双指针完成复写零操作,# 双指针,算法,【算法】活用双指针完成复写零操作,# 双指针,算法,【算法】活用双指针完成复写零操作,# 双指针,算法>


但是呢,就上面这样的逻辑去走的话其实是不对的,因为我们还未考虑到特殊的边界情况

  • 即下面的这种情况,当测试用例的倒数第二个数为0的时候,此时dest又刚好到这个位置,那么就需要向后移动两步,此时就造成了越界问题

【算法】活用双指针完成复写零操作,# 双指针,算法

所以此时我们应该要考虑处理一下这个边界问题

  • 因为倒数第二个数为0,那么对其进行复写操作的话,最后一个也是0,我们将其做一个修改即可,不过呢两个指针curdest也需要去做一个变化,cur前移一位即可,dest因为做了复写操作,所以需要前移两位

【算法】活用双指针完成复写零操作,# 双指针,算法

从后往前进行复写操作

上面呢,我们已经找到了需要复写的最后一个位置,那接下去我们就要正式开始复写操作了

  • 这一块的话就不做动画演示了,读者可以试着自己去手动模拟一下,也就是从我们上面所找到的cur位置开始,慢慢地向前遍历然后去做复写操作即可,将数一一地复写到dest所在的位置,如果arr[cur]为0的话,那我们就需要考虑复写两次了

【算法】活用双指针完成复写零操作,# 双指针,算法

代码展示

最后来展示一下整体的代码

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        // 1.找到复写的最后一个位置
            // (1) 判断cur位置的值,决定dest走一步还是两步
            // (2) 判断dest是否到达末尾,决定cur是否++
        int dest = -1;
        int cur = 0;
        int sz = arr.size();
        while(dest < sz)
        {
            if(arr[cur])  dest++;
            else   dest += 2;
            if(dest >= sz - 1)
                break;
            cur++;
        }

        // 2.判断边界的情况
        if(dest == sz)
        {
            arr[dest - 1] = 0;
            cur--;
            dest -= 2;
        }     

        // 3.从右往左复写0
        while(cur >= 0)
        {
            if(arr[cur]) arr[dest--] = arr[cur--];
            else
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }   
    }
};

下面是运行后的结果

【算法】活用双指针完成复写零操作,# 双指针,算法

【算法】活用双指针完成复写零操作,# 双指针,算法文章来源地址https://www.toymoban.com/news/detail-667939.html

到了这里,关于【算法】活用双指针完成复写零操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法专题--双指针算法】leetcode--283. 移动零、leetcode--1089. 复写零

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 双指针 常见的双指针有两种形式,一种是对撞指针,⼀种是左右指针。 对撞指针:一般用于顺序结构中

    2024年03月17日
    浏览(35)
  • LeetCode —— 复写零(双指针)

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 将数组中出现的每个零复写一遍,然后将其他元素向右平移,数组长度不能改变。      

    2024年02月10日
    浏览(31)
  • [双指针](一) Leetcode 283.移动零和1089.复写零

    [双指针] Leetcode 283.移动零和1089.复写零 移动零 283. 移动零 1.题意分析 (1) 给你一个数组,将数组中的 所有0移动到数组的末尾 (2) 保证非0元素在数组中 相对位置不变 (3) 在原数组中操作 2.解题思路 由于题目要求我们移动数组内容(也就是交换两个数的位置),所以我们很容易

    2024年02月08日
    浏览(31)
  • 对无向图进行邻接矩阵的转化,并且利用DFS(深度优先)和BFS(广度优先)算法进行遍历输出, 在邻接矩阵存储结构上,完成最小生成树的操作。

    目录 一 实验目的 二 实验内容及要求 实验内容: 实验要求: 三 实验过程及运行结果 一 算法设计思路 二 源程序代码 三、截图 四 调试情况、设计技巧及体会 1.掌握图的相关概念。 2.掌握用邻接矩阵和邻接表的方法描述图的存储结构。 3.掌握图的深度优先搜索和广度优

    2024年02月04日
    浏览(44)
  • 【Verilog】用双口RAM实现同步FIFO

    端口说明如下表。 双口RAM端口说明: 同步FIFO端口说明: 输入描述: input clk , input rst_n , input winc , input rinc , input [WIDTH-1:0] wdata 输出描述: output reg wfull , output reg rempty , output wire [WIDTH-1:0] rdata 双口RAM和代码框架: 同步FIFO,就是我们学习其他经典计算机语言(如C语言)的数据结

    2024年02月07日
    浏览(29)
  • 活用 命令行通配符

    本文是对 阮一峰老师 命令行通配符教程 [1] 的学习与记录 通配符早于正则表达式出现,可以看作是原始的正则表达式. 其功能没有正则那么强大灵活,而胜在简单和方便. - 字符 切回上一个路径/分支 如图: !! 代表上一个命令, 如图: [Linux中“!\\\"的神奇用法](https://www.cnblogs.com/bian

    2024年02月10日
    浏览(45)
  • Python 字符串应该用双引号还是单引号?

    PyCharm升级至 2023.2版本后,经常弹出来一个提示问我要不要试一下Black formatter。 试了一下,这个Black formatter 很有个性,特别喜欢换行。我的一个文件用PyCharm自带的代码整理器整理完之后是500行左右,然后再用Black整理就变成600多行了。 原来Black是Python Software Foundation主导的开

    2024年04月16日
    浏览(19)
  • react经验9:循环渲染的语法活用

    在react中,循环渲染一般这么写 react语法规定每个循环的标签需要加不重复的key,只能有一个根标签。 如果一次循环要输出多个标签怎么办? 这个例子是一次循环输出两个标签,key加在了Fragment上。 Fragment在react中表示空标签,用于向语法妥协的占位,平时可简写为\\\"/\\\" 在需要

    2024年01月20日
    浏览(25)
  • 探索stable-diffusion技术乐园:活学活用界面参数

    嗨!欢迎踏入我们充满有趣和创新的stable-diffusion技术乐园,让我们一起走进stable-diffusion界面参数的世界,看看怎样如行家袋里取物般自在地活用这些参数! 看了这么多大V、大卡和群粉们使用的英文,提起来有点沉,别急,我会尽量使用轻松的语气带你一起探索这些小秘密。

    2024年02月15日
    浏览(81)
  • 活用 F12 开发者工具,测试效率原来可以提高这么多

    F12开发者工具是浏览器自带的一个开发调试工具,因为可以用F12快捷键直接启动,所以简称为F12工具。 F12工具因为有如下的特点,所以被开发和测试人员广泛使用: 1.简单轻量免安装,是浏览器内置的开发者工具,可以提供捕获浏览器的数据报文的功能; 2.作为浏览器的一部

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包