Leetcode刷题-----移动零283复写零问题1089

目录

1.问题介绍

1.1题目要求

1.2思路分析

1.3想法实现

2.复写零问题

2.1问题分析

2.2思路分析

2.3想法实现


1.问题介绍

1.1题目要求

把这个数组里面为0的元素挪动到这个数组的后面,其他的非零元素的相对位置保持不变;

1.2思路分析

这个里面,我们是把这个数组划分为三个区域,左边区域,右边区域和中间区域,这三个区域里面存放着特定的数据,方便我们对于这个数据进行管理;

三个区间就是有两个分隔符,第一个就是使用的dest指针分开的,第二个就是用的cur指针分开的,cur指针就是用来遍历这个数组里面的元素的,cur左边就是已经遍历完成的元素,cur右边就是待处理的元素,其中已经处理的元素里面可能有0元素,我们的这个dest指针指向的就是已经处理的元素里面的最后一个非零元素的位置;

1.3想法实现

我们上面已经介绍了,这个cur指针就是用来遍历这个数组的,因此咋刚开始的时候,这个cur指针指向这个数组里面下标是0的元素,dest指向的是这个已经遍历的元素里面最后一个不是0的元素;

因此这个dest这个时候指向的就是-1下标位置,因为这个时候我们的cur还没有开始遍历数组;

我们的外层就是遍历数组元素的for循环,内层有一个if循环,是用来判断这个数组元素是否是0,如果是0,我们的cur直接加加,不是0的话才会进入这个if循环,我们让这个指针指向的非零元素和dest++即dest指向的下一个元素0进行交换,这样就可以让这个非0元素放到数组前面,0放到数组后面;

2.复写零问题

2.1问题分析

这个题目表面上面打的标签的简单,但是想使用双指针实现这个确实很有难度的,对于初学者,理解上没难度,但是想要自己第一次就独立的实现却很困难,这个就是把是0的元素重复写2次,不是0的元素就直接写一次即可,但是这个因为是0一次写2次,这个最后有一些元素没有写进来(因为这个数组元素个数是有限的),像下面的第一个实例,写到4这个数组元素就填满了,这个时候的5和最后一个0就不需要管了;

2.2思路分析

下面的这个就是思路,但是初学者一般想不到,下面的这个是优化之后的版本,原来的版本是异地进行复写(但是题目要求是在就地进行解决问题),优化之后不想要开辟新的空间,在原来的基础上面就可以复写;

首先一个我们需要明确的就是这个指针的遍历,移动都是从后向前移动的,因为如果是从前向后移动,这个两个0的复写就会覆盖掉后面一个位置的元素,因此我们会从后向前复写;

我们把这个过程程序化,分为了三个步骤第一步就是确定这个复写位置开始的元素,这个具体是什么意思呢?使用我们上面的官方题目下面的第一个案例来讲,这个4就是我们要开始复写的位置;因为这个案例我们已经知道复写位置,当面对其他的测试用例的时候,我们需要首先找到这个位置开始的地方,才可以进行后续的运算;

我们的方法就是判断cur位置的数值,当是0的时候,这个dest移动2步,当不是0的时候,dest移动一个步长,当这个dest指向这个数组里面的最后一个元素的时候,这个cur指向的位置就是这个复写的位置;

当然我们还会遇到一类特殊情况需要处理一下,就是当这个数组元素是1-2300这个情况的时候,这个dest按照上面的思路就会直接到达这个n下标的位置,这个就会直接越界;

这个时候我们进行的特殊处理就是把这个n-1下标,也就是最后一个数组元素置为0,cur--,dest-=2,这个操作完成之后也是可以找到正确的复写位置的(这个就很难想到,我觉得);

最后我们从后向前进行遍历,cur指向的元素不是0的时候,这个cur指向的元素赋值给dest位置,然后两个指针都向前移动一位,当这个cur指向-0的时候,这个dest以及前面的一个位置的元素全部都要置为0,然后让这个dest--,cur--直到这个cur完成全部数组元素的遍历;

2.3想法实现

其实真正的按照老师讲的这个双指针解决这个问题确实过于复杂,我们可以直接通过下面的暴力解法求解这个问题,让这个两个循环来回的挪动数据,只不过这个是0后面的元素都要挪动,在数据量比较小的时候,这个方法还可以用一下,当这个数据量比较大的时候,这个方法的时间复杂度就会比较大了,反正这两个各有利弊吧,论难易度的话,下面的这个暴力算法可能会更简单一些;

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

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

相关文章

甄选范文“论软件测试中缺陷管理及其应用”软考高级论文,系统架构设计师论文

论文真题 软件缺陷指的是计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。缺陷的存在会导致软件产品在某种程度上不能满足用户的需要。在目前的软件开发过程中,缺陷是不可避免的。软件测试是发现缺陷的主要手段,其核心目标就是尽可能多地找…

场外期权如何报价?名义本金是什么?

今天带你了解场外期权如何报价?名义本金是什么?投资者首先需要挑选自己想要进行期权交易的沪深上市公司股票。选出股票后,需要将股票信息、预期的操作时间(如期限)、看涨或看跌的选择以及预计的交易金额等信息报给场外…

Cisco OSPF LSA 类型详解指南

注:机翻,未校对。 OSPF LSA Types: The Ultimate Guide OSPF LSA Types – OSPF LSA 类型 – OSPF uses LSAs or Link state Advertisements to share information of each network and populate the LSDB (Link State Database). The LSAs are used by…

ppt模板如何制作?5个工具让你事半功倍

让我瞧瞧是谁还在为寻找PPT模板而发愁? 其实这可不是什么难题~身为职场高效打工人的我,今天便特地为大家整理了5大ppt模板ai生成神器~想知道都有哪些选择吗?接着往下看你便清楚啦! ✮迅捷PPT ☺使用场景:商业演示、教…

dsp c6657 SYS/BIOS学习笔记

1 SYS/BIOS简介 SYS/BIOS是一种用于TI的DSP平台的嵌入式操作系统(RTOS)。 2 任务 2.1 任务调度 SYS/BIOS任务线程有0-31个优先级(默认0-15,优先级0被空闲线程使用,任务最低优先级为1,最高优先级为15&am…

《MySQL DBA 修炼之道》第五章 查询优化

《MySQL DBA 修炼之道》原文是在第六章 查询优化,博主觉得比较重要,所以想提前整理为一篇博文。 查询优化是研发人员比较关注也是疑问最多的领域。 基础知识 1. 查询优化的常用策略 一般的常用策略 优化数据访问、重写SQL、重新设计表、添加索引 4种…

【鸿蒙开发】鸿蒙ArkUI自定义组件如何封装一个好用的Toast/Loading/ProgressHUD组件

1. HUD 在移动端 App 开发中,Toast 、 Loading 和 Progress 是十分常用的UI控件,如果不做特殊要求,一般可以直接使用系统 API 提供的方法,但如果想要定制化 UI,就需要自定义实现了。 在 HarmonyOS 中,Toa…

Leetcode—769. 最多能完成排序的块【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—769. 最多能完成排序的块 实现代码 class Solution { public:int maxChunksToSorted(vector<int>& arr) {int ans 0;int mx INT_MIN;for(int i 0; i < arr.size(); i) {mx max(arr[i], mx);if(mx i) {a…

单GPU训练一天,Transformer在100位数字加法上就达能到99%准确率

乘法和排序也有效。 自 2017 年被提出以来&#xff0c;Transformer 已成为 AI 大模型的主流架构&#xff0c;一直稳站 C 位。 但所有研究者都不得不承认的是&#xff0c;Transformer 在算数任务中表现非常糟糕&#xff0c;尤其是加法&#xff0c;这一缺陷在很大程度上源于 Tra…

python毕业设计选题求职招聘系统-可视化大屏

✌网站介绍&#xff1a;✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。 ✌服务范围&#xff1a;Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。 ✌服务内容&#xff1a;免费功能设计、免费提供开题答辩P…

虚拟机配置RabbitMQ集群教程

RabbitMQ是常用的一款消息中间件&#xff0c;那么如何在我们虚拟机中创建其集群呢&#xff1f;跟着博主这篇文章让你一步到位 本篇搭建的是三台机器为一个集群&#xff01;假设大家虚拟机都为初始化状态&#xff0c;从0开始&#xff08;注意集群搭建需要CentOS8以上环境&#x…

Linux:基础

一、安装 二、 一些组件 2.1 git管理 集中式版本控制系统:版本库是集中存放在中央服务器的,需要时要先从中央服务器取得最新的版本进行修改,修改后再推送给中央服务器。集中式版本控制系统最大的毛病就是必须联网才能工作,网速慢的话影响太大。 分布式版本控制系统:分布…

Redis的使用场景——热点数据缓存

热点数据缓存 Redis的使用场景——热点数据的缓存 1.1 什么是缓存 为了把一些经常访问的数据&#xff0c;放入缓存中以减少对数据库的访问效率&#xff0c;从而减少数据库的压力&#xff0c;提高程序的性能。【在内存中存储】 1.2 缓存的原理 查询缓存中是否存在对应的数据如…

学习记录day19——数据结构 查找算法

概念 在给定数据元素的某个值&#xff0c;在查找表中确定一个其关键字等于给定值的数据元素的操作&#xff0c;叫做查找 查找的分类 顺序查找:将待查找数据&#xff0c;进行全部遍历一遍&#xff0c;直到找到要查找的元素 折半查找:每次都去除一半的查找范围的查找方式&#x…

Easy es问题总结

官网教程&#xff1a;https://www.easy-es.cn/pages/ac41f0/#settings 一 测试项目 1 pom <dependencies><!-- 排除springboot中内置的es依赖,以防和easy-es中的依赖冲突--><dependency><groupId>org.springframework.boot</groupId><artifa…

JavaScript 将网址 www. 抹去

简单好用 https://andi.cn/page/621609.html

【OpenCV C++20 学习笔记】序列化——XML和YAML文件处理

序列化——XML和YAML文件处理 序列化和反序列化代码实现XML/YAML文件的打开和关闭写入或读取文本和数字写入或读取OpenCV数据写入或读取数组以及map读取和写入自定义数据类型 输出结果 序列化和反序列化 如果希望永久保存某些对象&#xff0c;而不是每次运行程序的时候重新创建…

3DGS如何重塑点云配准?港中大开源首例3DGS配准工作!

论文标题&#xff1a; GaussReg: Fast 3D Registration with Gaussian Splatting 论文作者&#xff1a; Jiahao Chang, Yinglin Xu, Yihao Li, Yuantao Chen, and Xiaoguang Han 开源地址&#xff1a;https://jiahao620.github.io/gaussreg 导读&#xff1a; 点云配准是实现…

JavaScript(15)——操作表单元素属性和自定义属性

操作表单元素属性 表单很多情况&#xff0c;也需要修改属性&#xff0c;比如点击眼睛可以看到密码&#xff0c;本质是把表单类型转换为文本框正常的有属性有取值的&#xff0c;跟其他的标签属性没有任何区别 获取&#xff1a;DOM对象.属性名 设置&#xff1a;DOM对象.属性名…