分析
根据题目的意思,我们要把零全部移动到后面,在某个位置,前面都不是零,后面都是零,并且要保证非零数字的相对位置不变。
题解
双指针
- 因为只要后面都是零就可以了,所以我们可以直接把非零数字直接按顺序赋值到前面,后面统一处理后面该为零的位置。
slow指针记录非零数字应该存储的位置。fast指针记录非零数字的位置。
代码
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slow = 0;
for(int fast = 0; fast < nums.size(); fast++) {
if(nums[fast]) {
nums[slow++] = nums[fast];
}
}
while(slow < nums.size()) {
nums[slow++] = 0;
}
}
};
时间复杂度
优化版本
直接交换即可,不用二次处理
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slow = 0;
for (int fast = 0; fast < nums.size(); ++fast) {
if (nums[fast] != 0) {
swap(nums[slow], nums[fast]);
slow++;
}
}
}
};

