(2)双指针练习:复写零

news2024/11/15 9:45:32

复写零

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

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

思路解析:

本题有两种思路:

  1. 暴力复写
  2. 双指针原地复写
  • 暴力复写

暴力的方法很简单,因为是复写,所以只需要遇到0先将0位置后面的数据进行挪动覆盖,但是注意要从尾部开始挪动,挪动完毕后在当前位置的下一个位置插入一个数字0,让指针走两步

暴力复写参考代码:

/*
 * @lc app=leetcode.cn id=1089 lang=cpp
 *
 * [1089] 复写零
 */

// @lc code=start
// 暴力解法
class Solution
{
public:
    void duplicateZeros(vector<int> &arr)
    {
        for (int i = 0; i < arr.size(); i++)
        {
            if (arr[i] == 0 && arr.size() - 2 > 0)
            {
                int j = arr.size() - 2;
                while (j + 1 < arr.size() && j > i)
                {
                    arr[j + 1] = arr[j];
                    j--;
                }
                if (i + 1 < arr.size())
                {
                    arr[++i] = 0;
                }
            }
        }
    }
};
//  @lc code=end
  • 双指针原地复写

对于双指针算法来说,有两种实现方式,第一种是异地复写,即开辟一个新空间,基本思路为遇到非0数字复写一次,遇到数字0复写两次,但是这个算法的空间复杂度为O(N),所以考虑原地复写

双指针——异地复写参考代码:

/*
 * @lc app=leetcode.cn id=1089 lang=cpp
 *
 * [1089] 复写零
 */

// @lc code=start
// 双指针——异地操作
class Solution
{
public:
    void duplicateZeros(vector<int> &arr)
    {
        vector<int> ret;
        ret.resize(arr.size());
        int cur = 0;
        int dest = 0;
        while (dest < ret.size())
        {
            if (arr[cur] == 0)
            {
                dest++;
                dest++;
                cur++;
            }
            else
            {
                ret[dest++] = arr[cur++];
            }
        }
        arr.assign(ret.begin(), ret.end());
    }
};
//  @lc code=end

原地复写和异地复写的思路是一致的,但是原地复写不可以从源数组的第一个元素开始复写,这样会导致遇到数字0时后面的内容全部都覆盖为0,正确的做法是从最后一个待复写元素开始向最后一个位置进行复写,再依次往前遍历执行复写操作,复写具体操作为:

  1. 遇到非0数字向dest位置覆写当前cur位置的数字
  2. 遇到0数字向dest位置和dest-1位置复写两个0
  3. cur向前移动1步

现在的问题就是如何找到最后一个待复写的元素,可以考虑一次正向遍历,但是在这一次遍历中不进行任何的复写操作,具体操作为:

  1. cur所在位置是非0的数字:dest移动一步
  2. cur所在位置是数字0:dest移动两步
  3. 判断dest是否到最后一个元素的位置
  4. cur移动一步

遍历完成后cur所指向的位置即为最后一个待复写的元素,而dest所指向的位置即为最后一个元素的位置,如图所示:

但是此时需要注意一种特殊情况:

当指向的待复写元素是0时,那么此时dest指向的位置已经超出了数组的范围,如果此时在dest位置复写时就会出现越界访问的情况,那么此时需要进行边界修正,修正方法如下:

  1. dest-1的位置处覆写数字0
  2. cur向前走动一步
  3. dest向前走动两步

处理完边界情况后就可以进行正常的复写操作过程

双指针——原地复写参考代码:

/*
 * @lc app=leetcode.cn id=1089 lang=cpp
 *
 * [1089] 复写零
 */

// @lc code=start
// 双指针——原地操作
class Solution
{
public:
    void duplicateZeros(vector<int> &arr)
    {
        int cur = 0, dest = -1;
        int sz = arr.size();
        // 找到结果数组中的最后一个重写的元素的位置
        while (cur < sz)
        {
            if (arr[cur] == 0)
            {
                dest += 2;
            }
            else
            {
                dest++;
            }

            if (dest >= sz - 1)
            {
                break;
            }
            cur++;
        }

        // 修正边界情况
        if (dest == sz)
        {
            arr[dest - 1] = 0;
            cur--;
            dest -= 2;
        }

        // 覆写
        while (cur >= 0)
        {
            if (arr[cur])
            {
                arr[dest--] = arr[cur--];
            }
            else
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }
    }
};
//  @lc code=end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1679995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

想做好抖店?新手、老玩家切勿掉进这些坑,操作要慎重!

大家好&#xff0c;我是电商花花。 很多人都说做抖音小店不需要脑子&#xff0c;会抄就行&#xff0c;难道做店真的就是这样吗&#xff1f; 真的就是会抄&#xff0c;会简单选品&#xff0c;找一些达人就能出单&#xff0c;就能实现睡后收入了吗&#xff1f; 其实并不见得&a…

✅HTTPS和HTTP的区别是什么?

一、问题解析 HTTP和HTTPS是两种协议&#xff0c;分别是Hypertext Transfer Protocol和HyperText Transfer Protocol Secure。 HTTPS还经常被称之为HTTP over SSL或者HTTP over TSL&#xff0c;HTTPS经由HTTP进行通信&#xff0c;但利用SSL/TLS来加密数据包。 他们的区别主要…

【35分钟掌握金融风控策略28】贷中模型体系策略应用

目录 贷中模型体系策略应用 信用模型体系和模型在策略中的应用 反欺诈模型体系和模型在策略中的应用 运营模型体系和模型在策略中的应用 贷中模型体系策略应用 在贷前模型部分已经讲过&#xff0c;贷前开发的很多模型是可以在贷中直接使用的。贷中与贷前的不同点在于&…

三大平台直播视频下载保存方法

终于解决了视频号下载的问题&#xff0c;2024年5月15日亲测可用。 而且免费。 教程第二部分&#xff0c;有本地电脑无法下载的解决方案。 第一部分&#xff1a;使用教程&#xff08;正常&#xff09; 第1步&#xff1a;下载安装包 下载迅雷网盘搜索&#xff1a;大海福利合集…

建模:3dmax

3Dmax 制作模型和动画&#xff08;橘肉&#xff09;&#xff1b; RizomUV 对模型进行展UV&#xff08;橘皮&#xff09;&#xff1b; Substance Painter 纹理手绘&#xff08;给橘皮制定想要的皮肤&#xff09;&#xff1b; 1.基础 1.1可编辑多边形、可编辑样条线 体、面都需要…

【计算机毕业设计】springboot二手家电管理平台

时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;二手家电管理平台当然不能排除在外。二手家电管理平台是在实际应用和 软件工程的开发原理之上&#xff0c;运用java语言以及前台VUE框架&#xf…

【论文阅读】VMamba: Visual State Space Model

VMamba:视觉状态空间模型 code&#xff1a;https://github.com/MzeroMiko/VMamba Background ​ CNN拥有线性复杂度因而可以处理高分辨率的图像&#xff0c;而ViT在拟合能力方面超过了CNN&#xff0c;但ViT是二次复杂度&#xff0c;在处理高分辨率图像时计算开销较大。ViT通过…

深度盘点解析一家公司的PMO的定位与发展规划

对于一家公司的PMO(项目管理办公室)的定位与发展规划,今天从以下几个方面进行深度盘点和解析,具体如下: 一、PMO的定位 1. 战略与推手:PMO是持续提升组织项目管理水平,实现组织所有项目成功的重要推手。它站在公司战略的高度,从全局视角出发,对公司内部的项目进行统一…

MyBatis-Plus简介

一、简介 官网&#xff1a;https://baomidou.com/ MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 二、特性 无侵入&#xff1a;只做增强不做改变&#xff0c;引…

Blender雕刻建模_笔画,镜像,动态拓扑

笔画 笔画选项&#xff0c;一般是对刷子&#xff08;自由线&#xff09;工具设置 描边方法如下&#xff1a;标红的为常用 -间隔&#xff1a;按一定间隔应用笔画的结果 例如&#xff1a;笔刷半径50&#xff0c;笔画间隔100%&#xff08;笔刷直径的百分比&#xff09;&#x…

聊聊数据库索引

一、索引类型介绍 索引是对数据库表中一列或多列的值进行排序的一种结构。 一个非常恰当的比喻就是书的目录页与书的正文内容之间的关系&#xff0c;为了方便查找书中的内容&#xff0c;通过对内容建立索引是对数据库表中一列或多列的值进行排序的一种结构。 索引形成目录。索…

南网上行通信规约报文解析软件

本文分享一个南网上行通信规约20140617 报文解析软件 下载链接: https://pan.baidu.com/s/1ngbBG-yL8ucRWLDflqzEnQ 提取码: y1de 主界面如下图所示&#xff1a; 本软件同时支持南网上行通信规约20140617-Fn查询功能 软件同时支持多种规约类型&#xff0c;如&#xff1a;国网…

DRF 跨域问题

【一】说明 CORS&#xff08;跨来源资源共享&#xff0c;Cross-Origin Resource Sharing&#xff09;是一种浏览器技术的规范&#xff0c;旨在解决浏览器同源策略&#xff08;Same-Origin Policy&#xff09;的限制&#xff0c;使得Web服务可以从不同的网域&#xff08;源&…

社媒市场规模增长80%,户外运动热潮来袭,品牌如何挖掘蓝海机会?

近年来&#xff0c;越来越多的人开始远离城市喧嚣&#xff0c;走到户外拥抱大自然。Citywalk、露营、登山、徒步、钓鱼、冲浪、骑行、攀岩……户外的边界不断拓宽&#xff0c;可以爬山涉水&#xff0c;也可以只是在公园胡同里遛弯。 户外运动逐渐趋向大众化和日常化。据相关部门…

Java中的数组、Set、List、Map类型的互相转换总结

序言 数组、Set、List、Map是Java语言非常常用的几种数据类型&#xff0c;他们之间存在着千丝万缕的联系。关于底层的数据结构我这里就不再多说啦&#xff0c;直接从应用出发&#xff0c;总结他们之间的转换方法&#xff0c;并给出推荐方法。 大家可以点赞收藏等到需要的时候…

(保姆级教程傻瓜式操作)树莓派--基于opencv实现人脸识别

前言 因为当时没有边实验边记录&#xff0c;所以这篇文章可能存在疏漏。不过很多地方我推荐了我参考过的博客或者视频&#xff0c;希望尽可能地解答您的疑惑&#xff0c;如果您仍有不懂的地方&#xff0c;欢迎评论&#xff0c;如果我知道答案&#xff0c;我会很乐意为您解答。 …

电脑缺失api-ms-win-crt-runtime-l1-1-0.dll文件的几种修复方法

当您在使用电脑过程中遇到程序启动失败&#xff0c;提示缺少“api-ms-win-crt-runtime-l1-1-0.dll”文件时&#xff0c;不必过于焦虑&#xff0c;此问题通常与Windows系统的Visual C Redistributable组件未正确安装或损坏有关。小编将介绍5种修复电脑缺失api-ms-win-crt-runtim…

jiebaNET中文分词器

最近我接手了一个有趣的需求&#xff0c;需要对用户评价进行分词&#xff0c;进行词频统计和情绪分析&#xff0c;并且根据词频权重制成词云图以供后台数据统计&#xff0c;于是我便引入了jieba分词器,但是我发现网上关于jiebaNET相关文档实在太少了&#xff0c;甚至连配置文件…

Maven依赖管理项目构建

Maven依赖管理项目构建工具 目录 文章目录 Maven依赖管理项目构建工具目录一、Maven简介1、为什么学习Maven1.1、Maven是一个依赖管理工具1.2、Maven是一个构建工具1.3、结论 2. Maven介绍3. Maven软件工作原理模型图&#xff08;了解&#xff09; 二、Maven安装和配置1. Mave…

链接表存储图(C++注释详解): 构建表 深度优先遍历 (DFS)

链接表的结构体单元: #define size 100 typedef struct node {int idx;//下一个节点的索引int wt;//权重, 也可根据实际情景存储边的信息struct node* next; }Node; Node* hd[size]; // 存储图的邻接表 链接表的的构建: int main() {int n, m;cin >> n >> m; //…