优选算法——双指针专题 1.移动零 2.复写零

优选算法------双指针专题 1.移动零 2.复写零

一.移动零

题目传送门\]([283. 移动零 - 力扣(LeetCode)](https://leetcode.cn/problems/move-zeroes/description/)) #### 1.题目描述 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/83b1e3b8a2b840909222ac8f337dcbb2.png) #### 2.算法原理 数组划分 数组分块 什么意思呢?就是把数组按要求划分模块 比如这道题,就是把数组划分成两个模块,前边是非0,后边是0 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b6260fc01c714bb4981431fe92a07804.png) 两个指针dest cur 将数组划分为三部分 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/02a8cd0f71f84dd882065fe8e2ccd663.png) 两指针作用: cur:从左向右扫描数组,遍历数组,cur左边就是处理过的,右边就是未处理的 dest:已处理的区间内,最后一个非0的位置 从而可以分为三个区间 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3b2b72e24a9a4f8e9ede22179914b0b0.png) 当cur到n时,最后一个区间不见了,只剩下前两个区间,并且前边是非0,后边是0 cur指向第一个元素。dest因为还没有确定最后一个非0元素的位置,所以先指向-1 cur移动时会遇见两种情况 1.遇到0时,cur++,从而保证\[dest+1,cur-1\]这个区间是0 代码就是cur++ 2.遇到非0时,要让这个 值加入到第一个区间,也就是\[0.dest\]这个区间,所以要dest移动到下一个位置从而扩大这个区间,并且dest移动到0,再交换此时dest和cur的位置 代码就是 swap(dest+1,cur) dest++,cur++ #### 3.代码实现 ```cpp class Solution { public: void moveZeroes(vector& nums) { for(int dest=-1,cur=0;cur& arr) { int cur=0,dest=-1,n=arr.size(); //1.找最后一个数 while(cur=n-1) break; cur++; } //2.处理边界情况 if(dest==n) { arr[n-1]=0; cur--,dest-=2; } //3.复写 while(cur>=0) { if(arr[cur]) arr[dest--]=arr[cur--]; else{ arr[dest--]=0; arr[dest--]=0; cur--; } } } }; ```

相关推荐
会员源码网1 天前
使用`mysql_*`废弃函数(PHP7+完全移除,导致代码无法运行)
后端·算法
木心月转码ing1 天前
Hot100-Day10-T438T438找到字符串中所有字母异位词
算法
HelloReader1 天前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱1 天前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng8971 天前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮2 天前
AI视觉连载8:传统 CV 之边缘检测
算法
blasit2 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
AI软著研究员2 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish2 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱2 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法