移动零---简单

题目:

  给定一个数组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了。

原文地址:https://www.cnblogs.com/manch1n/p/10314807.html