283. 移动零
思路1:
设置一个count==0,遍历数组如果遇到非零。就把这个数字填入到nums[count],count++这样就是o(N)的时间复杂度。然后如果不要求后面的元素的话就不用管了,如果要求后面的元素那就再从count开始遍历让他给其他数字,比如0
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int count=0;
for(int i=0;i<nums.size();i++){
if(nums[i]!=0){
nums[count]=nums[i];
count++;
}
}
for(int j=count; j<nums.size();j++)
nums[j]=0;
}
};
思路2:
可以采用双指针的形式,之前说的两数之和是两个头和尾的指针,这边的不太一样
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size(), left = 0, right = 0;
while (right < n) {
if (nums[right]) {
swap(nums[left], nums[right]);
left++; //left和right本来并驾齐驱的,right走的比left快地原因就是遇到0了,此时包含left到right前一个都是0!!只有出现新的希望非0才能改变这个现状。这里right代表待解决序列的头部。left代码已经解决序列的尾部,初始时候1 0 就是尾部了 这种问题就是设置了走法,一个东西是一直走,一个东西是有条件得走。
}
right++;
}
}
};