移动零_优选算法(C++)
网页直达:
https://leetcode.cn/problems/move-zeroes
题目分析:
1.将0放到后面,然后不改变非零数字的相对位置.
双指针算法:利用数组下标来充当指针.
cur指针:从左往右扫描数组,遍历数组
dest:已处理的区间,非零元素的最后一个位置.
分成三个区间:
[ 0 ,dest] [ dest ,cur ] [ cur , n-1]
[ 0 ,dest] :放非零元素
[ dest ,cur ] :放零元素
[ cur , n-1]:未遍历的数据
cur在向后面遍历的时候
1.遇到0元素,不管,cur++.
2.遇到非零元素,swap(dest+1,cur);dest++,cur++;
分析到这里其实已经讲完了.我们来回忆一下相似的题目,快速排序
快速排序:
基本思想其实和双指针法差不多:tmp是中间值
[0 ,tmp] [tmp ,n-1]
[0 ,tmp]:是小于tmp的值
[tmp ,n-1]:是大于tmp的值
代码实现:
无注释:
class Solution {
public:void moveZeroes(vector<int>& nums) {for(int cur=0,dest=-1;cur<nums.size();cur++ ){if(nums[cur]!=0){swap(nums[++dest],nums[cur]);}}}
};
注释:
class Solution {
public:void moveZeroes(vector<int>& nums) {for(int cur=0,dest=-1;cur<nums.size();cur++ )//cur遍历数组{if(nums[cur]!=0)//如果为零就在[0,dset]里面{swap(nums[++dest],nums[cur]);//交换}}}
};