Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].
Note:
You must do this in-place without making a copy of the array.
Minimize the total number of operations.
第一个想法就是,遇到零,count++,把后面的全部向前移,最后加上count个0。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int size = nums.size();
int count = 0;
int tmp = nums.size() - 1;
for(int i = 0;i < size;i++)
{
if(nums[i] == 0)
{
for(int j = i;j < size;j++)
{
nums[j] = nums[j + 1];
}
count++;
size--;
i--;//心机行:有一个用例是[0,0,1],移动一次之后变成了[0,1,0],而此时下一个循环中i = 1,所以结果就出现问题了。
}
}
for(int i = count;i > 0;i--)
{
nums[tmp] = 0;
tmp--;
}
}
};
不过….这个复杂度太高了….
所以又改了一个…那么就是说,只要是把非零尽量往前,计数几个零就好了,那么….
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int size = nums.size();
int pos = 0;
int count = 0;
for(int i = 0;i < size;i++)
{
if(nums[i] != 0)
{
nums[pos] = nums[i];
pos++;
}
else
{
count++;
}
}
for(int i = size - count;i < size;i++)
{
nums[i] = 0;
}
}
};
that’s it。。。
然而依旧不是最快。。。