当前位置: 首页 > news >正文

算法—双指针1.2

🌿力扣283-移动零

🧊题目链接:https://leetcode.cn/problems/move-zeroes/description/

🧊题目描述:

🧊题目分析:

该题可以用两个“指针”去操作数组,dest指针记录已处理区间的最后一个元素下标,cur去遍历数组,如果发现是非0的元素,就配合dest指针来操做数组,没有就继续往后遍历,然后注意下dest和cur啥时候++就行

🧊解题代码:

class Solution {public void moveZeroes(int[] nums) {int dest=-1,cur=0;for(cur=0;cur<nums.length;cur++){if(nums[cur]!=0){swap(nums,dest,cur);dest++;}}}public void  swap(int[] nums,int dest,int cur){int i =  nums[dest+1];nums[dest+1]=nums[cur];nums[cur]=i;}
}

🧊笔记:


🌿力扣1089-复写零

🧊题目链接:https://leetcode.cn/problems/duplicate-zeros/

🧊题目描述:

🧊题目分析:

首先复写零,我们可能第一时间想的是两个指针dest,cur;cur用于记录复写零之后最后一个数,dest来判断数组的遍历情况

而cur指针从前往后遍历,遇到0就dest走两步,否则就dest就走一步的意思,

然后找到了复写零之后最后一个数,再从后往前复写,关键就在这上面的逻辑没错,但忽略了dest指针超出数组这一情况,如果不处理,就会影响到这个从后往前复写的操作!!这很重要!!

dest指针超出数组这一情况如下:

可是cur指针也越界了,我们可不希望dest和cur指针越界,希望能正常进行从后往前复写零的操作!

所以我们先这样,每次不先cur++;而是先让dest先走走完之后,再判断dest到没到数组的组后一个位置,到了就cur不--了,因为cur所指的位置已经是最后一个复写零的位置了,

但是吧,dest确实也存在越界的情况!!如下

我们期望这样,可是不符合我们的逻辑,我们不可捡了芝麻丢了西瓜!!所以另外处理!!

所以需要走完循环之后来个if语句判断,如果dest超出数组了,就所以dest往回退两步,cur也往回退一步,并且最后一个数组的值置为0!!这个也不叫多么容易想出的逻辑,需要自己动手总结!!

所以我们花了很大的篇幅就是为了解决dest和cur越界的这两种情况!

总结两点:

1.找最后一个复写零时,记得dest可以先走,没事但cur走的时候,需要判断dest的位置是否已经>=数组的最后一个位置,成立cur就不走了,并退出循环,也就是cur如今的位置就是复写零的最后一个位置

2.退出循环后,我们发现dest有可能越界毕竟它走两步,万一它是走往两步之后才判断越界而退出循环的呢,所以需要特殊处理,具体的操作其实也就是自己实操,去发现规律,然后处理到位

🧊解题代码:

class Solution {public void duplicateZeros(int[] arr) {int dest=-1,cur=0;//找到最后一个元素下标while(true){//其实true和cur<arr.length都行,反正在如今的逻辑里cur不可能越界if(arr[cur]==0){dest+=2;}else{dest++;}if(dest>=arr.length-1){break;}cur++;//一定要后给cr++,这点很重要}//排除另外一种情况,也就是超出数组的那个情况if(dest!=arr.length-1){arr[arr.length-1]=0;dest-=2;cur--;}//复写操作for(;cur>=0;cur--){if(arr[cur]==0){arr[dest--]=0;  arr[dest--]=0;}else{arr[dest--]=arr[cur];}}}
}

🧊笔记:

 

本来想直接想多道题的,可是这第2个题,也确实花了不少时间!!下篇再分享吧!完结!!


文章转载自:

http://BaQJqrH7.sskns.cn
http://Tt9hkW2l.sskns.cn
http://PEy8jD6J.sskns.cn
http://snUX0QNp.sskns.cn
http://3eVdlZzP.sskns.cn
http://k0i7uun9.sskns.cn
http://ylxNnM8T.sskns.cn
http://vqzaSY0J.sskns.cn
http://6hmhXqlX.sskns.cn
http://mEIbrcwZ.sskns.cn
http://7UEGK98E.sskns.cn
http://Ai04xqie.sskns.cn
http://3SszhO4m.sskns.cn
http://oIQCqaER.sskns.cn
http://pMJ7cKpv.sskns.cn
http://DLFLEupd.sskns.cn
http://TlirjMIe.sskns.cn
http://9V3BKip5.sskns.cn
http://x9Zsv3b1.sskns.cn
http://dn8gEXpv.sskns.cn
http://krpm5PpG.sskns.cn
http://y1icuWlZ.sskns.cn
http://M88oiP6O.sskns.cn
http://E1Eli5AO.sskns.cn
http://nDW1H4vj.sskns.cn
http://t7D0dwWR.sskns.cn
http://dSYVtDsK.sskns.cn
http://NEifeh11.sskns.cn
http://hEZbKpfq.sskns.cn
http://PBF2GQ65.sskns.cn
http://www.dtcms.com/a/382907.html

相关文章:

  • hcl ac ap 本地转发学习篇
  • Velox:数据界的超级发动机
  • 嵌入式系统启动流程
  • TRAE通用6A规则+敏捷开发5S规则
  • 【Java后端】Spring Boot 集成雪花算法唯一 ID
  • 【知识管理】【科普】新概念的学习路径
  • flask入门(五)WSGI及其Python实现
  • 第17课:自适应学习与优化
  • 详解安卓开发andorid中重要的agp和gradle的关系以及版本不匹配不兼容问题的处理方法-优雅草卓伊凡
  • Linux应用开发(君正T23):三网智能切换及配网功能
  • 华为HarmonyOS开发文档
  • Java 文件io
  • 在Android Studio中配置Gradle涉及到几个关键的文件
  • 基于OpenCV的答题卡自动识别与评分系统
  • 贪心算法应用:出租车调度问题详解
  • 【RK3576】【Android14】如何在Android14下单独编译kernel-6.1?
  • FlashAttention(V2)深度解析:从原理到工程实现
  • ​Prometheus+Grafana监控系统配置与部署全解
  • 电路调试过程中辨认LED正负极并焊接
  • ubuntu24.04 缺少libwebkit2gtk-4.0和libssl.so.1.1
  • eslint-config-encode 使用指南
  • MySQL高阶查询语句与视图实战指南
  • 金融数学与应用数学(金融方向)课程重合度高吗?
  • 知识沉淀过于碎片化如何形成体系化框架
  • 第二十篇|SAMU教育学院的教育数据剖析:制度阈值、能力矩阵与升学网络
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十章知识点问答(10题)
  • dockercompose和k8s区别
  • HENGSHI SENSE 6.0技术解密:边缘计算+Serverless架构如何重构企业级BI实时性
  • Delphi - IndyHttpServer接收上传文件
  • 1.linux环境配置+ssh远程连接vscode调试(问题:无法联网,无法共享粘贴板,不满足运行vscode服务器的先决条件)