移动零---简单

Posted manch1n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移动零---简单相关的知识,希望对你有一定的参考价值。

题目:

  给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

  输入: [0,1,0,3,12]

  输出: [1,3,12,0,0]

思路:

  典型的双指针题目,用一个指针找到0,用另一个指针找到非零,两者交换,同时保证非零的指针较小。

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int length=nums.size();
        int i=0,j=0;
        while(i<length&&j<length)
        {
            while(i<length&&nums[i]!=0)   //find the num which is zero
            {
                i++;
            }
            j=i+1;
            while(j<length&&nums[j]==0) //not zero
            {
                j++;
            }
            if(i<length&&j<length)
            {
                std::swap(nums[i],nums[j]);
                i+=1;j+=1;
            }
        }
    }
};

技术分享图片

   时间复杂度为O(n),看起来比较糟糕。看一下大佬的:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        auto it=nums.begin();
        for(int i=0;i<nums.size();it++,i++ )
        {
            if(*it==0)
            {
                nums.erase(it--);
                 nums.push_back(0);
            }
        }
      
    }
};

  呀,看来我对vector还用不熟,看来有必要总结一下stl的vector了。

以上是关于移动零---简单的主要内容,如果未能解决你的问题,请参考以下文章

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

如何优化C ++代码的以下片段 - 卷中的零交叉

LeetCode刷题283-简单-移动零

LeetCode刷题283-简单-移动零

移动椭圆的板绘图代码