Leetcode·283·移动零

96 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

Leetcode·283·移动零

1. 题目

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

2. 分析

这道题目的难度是属于简单级别,但这道题目也是我们学习双指针解法的一道好题目。从给定的题目我们可以得出三个信息:

  1. 不得使用复制数组操作。
  2. 元素为0总在尾部,其余元素按照先后顺序不变。

3. 编码

思路一:使用冒泡排序的方法

为什么能使用冒泡排序的方法?题目中我们可以知道,我们的目标是将0移动到数组的末尾,而排序的目的不正是移动元素吗?因此我们仅仅需要将判定的条件更改一下即可以满足需求。

class Solution {
  public void moveZeroes(int[] nums) {
    for (int i = 0; i < nums.length - 1; i++) {
      for (int j = 0; j < nums.length - i - 1; j++) {
        if (nums[j] == 0) {
          int tempNum = nums[j + 1];
          nums[j + 1] = nums[j];
          nums[j] = tempNum;
        }
      }
    }
  }
}

思路二:利用快慢指针

快慢指针的本质无非就是建立两个指针,一左一右,一前一后,因此为了要实现题目的需要,我们必须让这两个指针一个指向0,而另外一个元素指向非0元素,且此时的左指针必须指向0,右指针必须指向非0元素,这样就能得到我们想要的结果。

class Solution {
  public void moveZeroes(int[] nums) {
    int j = 0;
    for(int i = 0;i < nums.length; i++) {
      if(nums[i]!= 0) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j++] = tmp;
      }
    }
  }
}  

4. 总结

思路一与思路二都可以解决这类排序的问题,二者的主要区别是在时间复杂度上,思路二比思路一在时间复杂度上少了一个指数级,相信大家通过此篇文章能有所收获。