1.题目
. - 力扣(LeetCode)
2.思路解析
这个题目的思路和“使用递归排序快速排序解决数组的排序问题”相同
class solution
{
public:
void QuickSort(vector<int>& nums, int left, int right)
{
if (left > right) return;
int key = left;
int pre = left;
int cur = left + 1;
while (cur <= right)
{
if (nums[cur] < nums[key])
{
pre++;
swap(nums[pre], nums[cur]);
}
cur++;
}
swap(nums[key], nums[pre]);
key = pre;
QuickSort(nums, left, key - 1);
QuickSort(nums, key + 1, right);
}
};
使用双指针des和cur
指针des和cur向右遍历
在非零区段中,des和cur一定是紧挨着的且cur一定比des快(cur在des右边)
cur遇到零之后,des就不走,但是cur要接着走,此时cur指向零,des指向cur之前一个非0元素
在下一个循环中,cur不指向0,cur和des同时向前走一格,此时des指向零,cur不指向零
3.代码
class Solution {
public:
void moveZeroes(vector<int>& nums)
{
int des=-1;
int cur=0;
while(cur<nums.size())
{
if(nums[cur]!=0)
{
des++;
swap(nums[cur],nums[des]);
}
cur++;
}
}
};