题目: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; } } };