Skip to content

Latest commit

 

History

History
40 lines (28 loc) · 2.12 KB

0283.移动零.md

File metadata and controls

40 lines (28 loc) · 2.12 KB

思路

做这道题目之前,大家可以做一做27.移除元素,我在讲解数组系列的时候针对移除元素写了这篇题解:数组:就移除个元素很难么?

这道题目,使用暴力的解法,可以两层for循环,模拟数组删除元素(也就是向前覆盖)的过程。

好了,我们说一说双指针法,大家如果对双指针还不熟悉,可以看我的这篇总结双指针法:总结篇!

双指针法在数组移除元素中,可以达到O(n)的时间复杂度,在数组:就移除个元素很难么?里已经详细讲解了,那么本题和移除元素其实是一个套路。

相当于对整个数组移除元素0,然后slowIndex之后都是移除元素0的冗余元素,把这些元素都赋值为0就可以了

如动画所示:

C++代码如下:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
            if (nums[fastIndex] != 0) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        // 将slowIndex之后的冗余元素赋值为0
        for (int i = slowIndex; i < nums.size(); i++) {
            nums[i] = 0;
        }
    }
};

我是程序员Carl组队刷题可以找我,本文leetcode刷题攻略已收录,更多精彩算法文章尽在:代码随想录,关注后就会发现和「代码随想录」相见恨晚!

如果感觉题解对你有帮助,不要吝啬给一个👍吧!