Leetcode 283 移动零

143 阅读2分钟

GitHub-LT-283-源码 :large_blue_diamond:双指针

问题描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 输入: [0,1,0,3,12] 输出: [1,3,12,0,0]

解法1:

  • 执行用时:12 ms, 在所有 C++ 提交中击败了23.55%的用户
  • 内存消耗:9 MB, 在所有 C++ 提交中击败了100.00%的用户

算法复杂度 O(n)

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


##解法2: 双指针,可以用于链表,数组 [如果是两个字符串是用链表存放的]

  • 执行用时:4 ms, 在所有 C++ 提交中击败了99.45%的用户
  • 内存消耗:9 MB, 在所有 C++ 提交中击败了100.00%的用户

算法复杂度 O(n)

class Solution {
public:
   void moveZeroes(vector<int>& nums) {
       int j=0;//统计0的个数
       for(int i=0;i<nums.size();i++){
           if(nums[i]!=0){
               nums[j]=nums[i];
               j++;
           }
       }
       for(int i=j;i<nums.size();i++){
           nums[i]=0;
       }
    }
};