移动零

题目 移动零

image-755f6a2d

思路分析

快排的思路 不过现在是同方向移动

指针i去找非0数 指针j找0

若j<i就交换(0在非0左边 交换)

若j<i(0在当前的非0右边 不交换 改变i状态 找下一个非0)

这样走到结尾就能使0全在最后

有个很牛的优化 本质也是0和非0交换

滚雪球

image_1537442610-329f3563

第一步 - 遇到 0。

现在的雪球的大小是 1。再进一步。

image-f861b9bb

下一步 - 遇到 1。将雪球最左边的 0 与元素 1 交换。

image-24243223

下一步——再次遇到0

image-1b356169

雪球球变大了,现在它的大小 = 2。

image-ebeb11f1

下一步 - 3. 再次与最左边的零交换。

image-09492956

看起来就是零一直在滚动

image-0673424a

下一步 - 12. 再次交换:

image-a6377210

到达终点

image-e939dea8

过程中只需要一个指针探 第二个指针直接等于第一个指针减去雪球大小即可

若出现非0 就做交换

代码实现

快排思路

class Solution {

public:

    void moveZeroes(vector<int>& nums) {

        int i=0,j=0;

        int n=nums.size();

        while(i<n && j<n)
{

            //i找非0数

            while(i<n && nums[i]==0){

                i++;

            }

            //j找0

            while(j<n && nums[j]!=0){

                j++;

            }

            if(i<n && j<n)
{

                //如果0在非0左边 交换

                if(j<i)

                    swap(nums[i],nums[j]);

                //如果0在当前的非0右边 不需要交换 找下一个非0数(改变i的状态)

                else

                    i++;

            }

        }

    }

};

滚雪球

class Solution {

public:

    void moveZeroes(vector<int>& nums) {

        int snowball=0;

        for(int i=0;i<nums.size();i++)

        {

            if(nums[i]==0)

                snowball++;

            else if(nums[i]!=0 && snowball>0)

            {

                swap(nums[i],nums[i-snowball]);

            }

        }

    }

};

同类题型

视频讲解


⬅️ 最长连续子序列 🏠 00-刷题理模型 ➡️ 翻转单词顺序