力扣算法题——283.移动零【系统讲解】
目录
💕1.题目
💕2.解析
💕3.代码实现
💕4.完结
二十七步也能走完逆流河吗
💕1.题目
我们先看题目要求
![]()
💕2.解析
本题可以分为数组划分类型的题目,因为它需要一边是0,另一边是非0,因此,本题的区间范围可以规划成这样,cur表示快指针,用来遍历数组,des表示目标指针,也就是慢指针,用来表示已经进行处理的记录点
根据题目,我们可以将整个数组分为三块区域
[0,des]表示非0区,[des+1,cur-1]表示0区,[cur,n-1]表示待处理处,保持每一个都是闭区间,方便循环的书写,同时只要保持每一次都是这个区间,这样直到待处理区域消失,就可以保证题目的正确
最开始我们可以记录des为-1,cur为0,因为des可以划分非0区,而刚开始没有被处理的内容,也就是没有非0区就是-1,cur设为0说明全是待处理区域,逻辑上也合理
在处理区域时,我们以用例为例子,数组【0,1,0,3,12】或者【1,3,0,0,12】
当cur遇到0,因为des右边的范围全为0区,所以des不需要动进行静等,因为它本身就位于des右边的区域。
而这个0已经被cur处理过了,待处理区改变了,所以cur需要移动一位,来表示处理了一个单位
当cur遇到非0时,说明des的非0区要增加,所以des先向右1位位置占住,然后与cur进行交换,交换后意味着处理好了,处理好了后cur就需要向右1位更改待处理区
以上的每次都没有改变区间的完整性
💕3.代码实现
class Solution { public: void moveZeroes(vector<int>& nums) { int cur = 0; int des = -1; while(cur<=nums.size()-1) { if(nums[cur]!=0) { des+=1; swap(nums[des],nums[cur]); cur+=1; }else { cur+=1; } } } };