优选算法——双指针专题 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--; } } } }; ```

相关推荐
leaves falling17 小时前
C++模板进阶
开发语言·c++
无敌昊哥战神17 小时前
【保姆级题解】力扣17. 电话号码的字母组合 (回溯算法经典入门) | Python/C/C++多语言详解
c语言·c++·python·算法·leetcode
脱氧核糖核酸__17 小时前
LeetCode热题100——238.除了自身以外数组的乘积(题目+题解+答案)
数据结构·c++·算法·leetcode
再卷也是菜17 小时前
算法提高篇(1)线段树(上)
数据结构·算法
py有趣17 小时前
力扣热门100题之单词拆分
算法·leetcode
ouliten18 小时前
C++笔记:std::invoke
c++·笔记
j_xxx404_18 小时前
C++算法:哈希表(简介|两数之和|判断是否互为字符重排)
数据结构·c++·算法·leetcode·蓝桥杯·力扣·散列表
Aaron158819 小时前
RFSOC+VU13P+RK3588的核心优势与应用场景分析
嵌入式硬件·算法·matlab·fpga开发·信息与通信·信号处理·基带工程
优家数科19 小时前
精准预测:基于多维用水量的滤芯寿命预警算法
算法
脱氧核糖核酸__19 小时前
LeetCode热题100——189.轮转数组(题解+答案+要点)
数据结构·c++·算法·leetcode