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

相关推荐
颜酱2 分钟前
回溯算法实战练习(2)
javascript·后端·算法
We་ct8 分钟前
LeetCode 153. 旋转排序数组找最小值:二分最优思路
前端·算法·leetcode·typescript·二分·数组
享哥14 分钟前
tick 数据探索笔记:从抓取到理解
算法
liulilittle16 分钟前
eBPF tc prog
服务器·网络·c++·网络协议·tcp/ip·性能·perf
禹笑笑-AI食用指南17 分钟前
本地脱敏:把数据安全控制在自己手里
算法·ai·脱敏
JosieBook17 分钟前
【C#】C# 中的 enum、struct 和 class 对比总结
开发语言·算法·c#
cui_ruicheng17 分钟前
C++ 新特性(下):可变参数模板与 STL 扩展机制
开发语言·c++·c++11
拾荒的路由19 分钟前
HOT100DAY9记录用
数据结构·算法·leetcode
沙雕不是雕又菜又爱玩20 分钟前
leetcode第7题 整数反转(C++)
算法·leetcode
路小雨~34 分钟前
机器学习基础算法学习笔记
学习·算法·机器学习