题目:https://leetcode.com/problems/move-zeroes/
思路:
说是把0 挪到后面去,其实等同于把非0值往前挪。挪到什么地方呢?就得找个东西记录可以往前挪的“坑”。而这个“坑”有两种情况:
1.原来的值就是0的;
2.如果把当前的非0值往前面挪过了,那当前的位置也就空缺;
从一开始记录一下找到的0的个数,把非0值挪完了以后,最后几位写成0就行。
这一切的时间复杂度为O(n)
代码(用到了队列来存储坑的位置):
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int size = nums.size();
int zeroCount = 0;
queue<int> availIndices;
for(int i=0; i < size; i++){
if(nums[i] == 0){
zeroCount ++;
availIndices.push(i);
} else {
if(!availIndices.empty()) {
//Move forward
int index =availIndices.front();
availIndices.pop();
nums[index] = nums[i];
//Mark i as empty
availIndices.push(i);
}
}
}
for(int i = size - zeroCount; i < size; i++) {
nums[i] = 0;
}
}
};