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

相关推荐
寻寻觅觅☆8 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
fpcc8 小时前
并行编程实战——CUDA编程的Parallel Task类型
c++·cuda
偷吃的耗子9 小时前
【CNN算法理解】:三、AlexNet 训练模块(附代码)
深度学习·算法·cnn
化学在逃硬闯CS9 小时前
Leetcode1382. 将二叉搜索树变平衡
数据结构·算法
ceclar12310 小时前
C++使用format
开发语言·c++·算法
Gofarlic_OMS10 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
lanhuazui1010 小时前
C++ 中什么时候用::(作用域解析运算符)
c++
charlee4410 小时前
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
c++·faiss·onnx·rag·语义搜索
夏鹏今天学习了吗10 小时前
【LeetCode热题100(100/100)】数据流的中位数
算法·leetcode·职场和发展
老约家的可汗10 小时前
初识C++
开发语言·c++