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

相关推荐
sali-tec21 小时前
C# 基于OpenCv的视觉工作流-章62-线线距离
图像处理·人工智能·opencv·算法·计算机视觉
WolfGang0073211 天前
代码随想录算法训练营 Day53 | 图论 part11
算法·图论
呃呃本1 天前
算法题(图论)
算法·图论
一只数据集1 天前
商超上货人形机器人全身运控数据集分析——Kuavo 5机器人5W型号夹爪末端执行器操作轨迹数据
人工智能·算法·机器人
蜡笔小马1 天前
03.C++设计模式-原型模式
c++·设计模式·原型模式
神仙别闹1 天前
基于QT(C++)实现线性表的建立、插入、删除、查找等基本操作
java·c++·qt
谙弆悕博士1 天前
【附Python源码】基于决策树的信用卡欺诈检测实战
python·学习·算法·决策树·机器学习·数据分析·scikit-learn
MATLAB代码顾问1 天前
黏菌算法(SMA)原理详解与Python实现
开发语言·python·算法
salipopl1 天前
C/C++ 中 volatile 关键字详解:原理、作用与实际应用
开发语言·c++