283. 移动零

移动零

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

示例:

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

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

本人思路

题目要求必须在原数组上操作,很明显这是一道双指针类型的题目。我首先是这样想的,i 遇到 \(nums[i]=0\) 就停下,j 遇到 \(nums[j]!=0\) 就停下。然后交换 nums[i] 和 nums[j] 的位置,重复此操作即可完成题目要求。也就是说这个是特定条件下的选择排序,但提交上去的时间复杂度较高,原因应该是进行了大量的交换操作

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int i = 0, j = 0;
        int n = nums.size();
        while (i < n && j < n) {
           while (i < n && nums[i] != 0) {
               i++;
           }
           j = i + 1;
           while (j < n && nums[j] == 0) {
               j++;
           }
           if (i == n || j == n) break;
           swap(nums[i], nums[j]);
        } 
    }
};

最优解思路

说实话该思路一开始真是惊艳到我了。核心是:快指针遇到非零元素就赋值到慢指针处,然后慢指针移动一格,一旦快指针搜索完该数组所有的非零元素,就将慢指针之后的元素赋为0

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size();
        int j = 0;
        for (int i = 0; i < n; i++) {
            if (nums[i] != 0) {
                nums[j++] = nums[i]; 
            }
        }
        for(int i = j; i < n; i++) nums[i] = 0;
    }
};
posted @ 2021-02-26 19:43  snakeee  阅读(46)  评论(0)    收藏  举报