LeetCode —— 283. 移动零

101 阅读2分钟

启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

该题是数组移除元素题型第三题。

题目来源

283. 移动零 - 力扣(LeetCode)

题目描述(简单

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

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

示例1

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

示例2

输入: nums = [0]
输出: [0]

提示

  • 1<=nums.length<=1041 <= nums.length <= 10^4
  • 231 <=nums[i]<=231 1-2^{31} <= nums[i] <= 2^{31} - 1

题目解析

如果是可以添加新数组,可以通过循环遍历获得所有非零元素依次添加到新数组,最后在补 0 补齐与原数组长度相同即可。

在只能对原数组操作的前提下,便可以采用双指针的思路。

明确快慢指针的用处:

  • 慢指针:作为处理好序列的尾部
  • 快指针:作为待处理序列的头部

此题中双指针与 LeetCode —— 27. 移除元素 - 掘金 (juejin.cn) 该题最大区别在于,此题中快指针找到非零元素时,快慢指针对应的元素互换,同时快慢指针右移,反之,只有快指针右移。

注意: 可能有小伙伴觉得为什么要元素互换呢,直接慢指针对应元素等于快指针对应元素,然后快指针对应元素等于 0 不行吗,这时候需要考虑到 [1] 这种情况,这时慢指针不是指向零元素,因此只能使用元素互换才行。

双指针

代码

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let slow = 0, fast = 0
    while (fast < nums.length){
        if (nums[fast] === 0){
            fast++
        }else{
            let val = nums[fast]
            nums[fast] = nums[slow]
            nums[slow] = val
            slow++
            fast++
        }
    }
    return nums
};
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)

如图:

image.png

执行用时和内存消耗仅供参考,大家可以多提交几次。如有更好的想法,欢迎大家提出。