问题讲解(leetcode 283移动零问题)
1.问题解析
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
注意点:
-
原地操作代表不开辟新的数组
-
保存非零元素的相对位置
2.算法原理
1定义两个”指针“ 这两个指针不代表真正意义上的指针 能控制需要操作的数就行 如需要操纵数组的号 把数组的下标当作”指针就行“
2.指针一cur:用于遍历数组
指针二dest:已处理的区间内,非零元素的最后一个位置
3.下面我们可以将数组划分为三个区间:
[0,dest]:为已经处理过的区间
[dest+1,cur-1]:为零元素所处的区间
[cur,n]:为未处理的区间(n代表这个数组下标的最后一个数)
3.编写代码
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int cur=0;
//最开始还没有处理过的数字所以dest定义为-1
int dest=cur-1;
while(cur<nums.size())
{
if(nums[cur]==0)
{
cur++;
}
else
{
//找到合适的位置需要先++
//因为当前dest的位置存放的是已经处理过的数字
//处理过后cur要继续向后遍历
//但交换的是当前cur位置的数 所以使用的后置++
swap(nums[++dest],nums[cur++]);
}
}
}
};