解法:双指针
思路一:
覆盖,需要对数组中的每个元素操作一次(前面非零数复制,后面补零)
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int idx=0;
for(int i=0; i<nums.size(); i++){
if(nums[i]!=0) nums[idx++] = nums[i];
else continue;
}
for(; idx<nums.size(); idx++)
nums[idx]=0;
}
};
思路二:
交换,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。只需要操作 非零元素的个数 次,复杂度相同
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size(), left = 0, right = 0;
while (right < n) {
if (nums[right] != 0)
swap(nums[left++], nums[right]);
right++;
}
}
};