LeetCode 283 Move Zeroes

202 阅读1分钟

LeetCode 283 Move Zeroes

思路

  1. 维护两个指针,slow指针找到0,fast指针找到在slow指针后,不为0的元素,然后将这两个元素交换。

  2. 维护两个指针i和j,如果当前元素非0,则两个指针都向前移动,如果当前元素为0,则i向前移动,j不动,这样j便指向列0,此后j一直指向0。如果当前元素非0,则交换i指针和j指针指向的元素。

  3. 维护两个指针i和j。如果i指向的元素非0,则使用i指向的元素覆盖j指向的元素。如果i指向的元素为0,则什么也不做。在这个解法中,j指针与i指针之间的元素都已经遍历过,这些元素中,非0的部分已经覆盖了j之前的元素,因此,这些元素可以被覆盖,为0的部分将会被i之后的元素覆盖。当i遍历结束时,将j之后的元素全部赋0即可。

代码

方法1

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

方法2

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

方法3

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int j = 0;
        for (int i = 0; i < nums.size(); ++i) {
            if (nums[i]) 
                nums[j++] = nums[i];
        }
        
        for (; j < nums.size(); ++j)
            nums[j] = 0;
    }
};