hot100_移动零

移动零题解

hot100_移动零

分析

根据题目的意思,我们要把零全部移动到后面,在某个位置,前面都不是零,后面都是零,并且要保证非零数字的相对位置不变。


题解

双指针

  • 因为只要后面都是零就可以了,所以我们可以直接把非零数字直接按顺序赋值到前面,后面统一处理后面该为零的位置。
  • slow指针记录非零数字应该存储的位置。
  • fast指针记录非零数字的位置。
代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int slow = 0;
        for(int fast = 0; fast < nums.size(); fast++) {
            if(nums[fast]) {
                nums[slow++] = nums[fast];
            }
        }
        while(slow < nums.size()) {
            nums[slow++] = 0;
        }
    }
};

时间复杂度O(N)O(N)

优化版本

直接交换即可,不用二次处理

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int slow = 0;
        for (int fast = 0; fast < nums.size(); ++fast) {
            if (nums[fast] != 0) {
                swap(nums[slow], nums[fast]);
                slow++;
            }
        }
    }
};

283. 移动零 - 力扣(LeetCode)

chengzi