LeetCode之旅:283. 移动零

题意:

解法一:

使用两个下标 cur 和 end,cur 从后向前遍历,当遇到元素 0 时,根据 end 与 cur 的差值 count,将 count 个非零元素整体向前移动 1 位,end 处的元素置 0。以此类推。

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int cur = nums.size() - 1;
        int end = nums.size() - 1;
        int count = 0;
        
        while(cur >= 0){
            if(0 == nums[cur]){
                count = end - cur;
                for(int i = 0; i < count; ++i)
                    nums[cur + i] = nums[cur + i + 1];
                nums[end] = 0;
                --end;
            }
            --cur;
        }
    }
};

解法二:

使用两个下标 i 和 j,j 记住第一个 0 元素的位置,i 遍历数组,遇到非零元素时与 j 所指 0 元素交换,然后 j 向后移动 1 位,仍然指向第一个 0 元素。以此类推。

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

解法二明显比解法一好。

你可能感兴趣的:(LeetCode之旅)