双指针算法——移动0
本文是对于算法的分模块强化训练,并且对于算法套路的总结,例如模板,和经典的写法等。
关于双指针:
双指针的基本思路,就是有一个负责遍历的指针,和一个特殊处理的指针,进行具体逻辑的判断,当元素符合一些条件的时候就要进行处理,但是这个处理逻辑当然也会分为几大类,本题就是其中一种形式,关于区域的划分处理,就如同是快排的实现思路一样。
下面让我们来了解一下吧
😏本文由爱吃苹果的清梦,友情提供🐼
题目
题目解析
解法一:双指针区域划分处理
根据题目我们可以发现这个是类似于,vector的unique函数,都是将符合一定特征的数据移动到数组的末尾,其他的则是保存顺序进行存储,那么我们可以采用快排的思路,进行分区。
具体原理
如图所示,我们将,数据分为三个区域来达到我们的排序的要求,那么本题我们也可以采取同样的思路进行处理,将数据分为0区域和非0区域,和未处理的区域。
那我们只要在遍历过程中,保持这三个区域的稳定即可。那么具体逻辑,就是我每当遍历到非0的数据,我们就可以将非0的元素加入到第一个区间就行。
代码实现
class Solution {
public:
void moveZeroes(vector<int>& nums) {
//定义指针
for(int i = -1,j = 0;j < nums.size();j++)
{
//cout << nums[j] << endl;
if(nums[j])
{
swap(nums[++i],nums[j]);
}
}
}
};
解法二:直接覆盖
其实就是在上边的代码中进行,修改只要是非0就进行重排和上文思想基本类似,只不过最后需要将0,进行回复。
后记
这就是一个简单的双指针算法题,但是,好久不做了,没有思路了,菜鸡伏地。
需要将0,进行回复。