leetcode-283-移动零

122 阅读2分钟

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

Hi, 大家好。我是新人,程序员库里。

今后会按类分享算法题。

今天给大家分享第1道leetcode上数组中使用双指针相关的算法题。

283.移动零

leetcode地址:leetcode-cn.com/problems/mo…

难度

简单

描述

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

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

示例1

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

示例2

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

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

解法一

1.利用快慢指针,快指针指向的元素如果不等于0的话,放把它放到前面来,也就是放到慢指针所指向的位置,慢指针向后移1位

2.快指针走到数组末尾了,慢指针前面的都是不等于0的元素

3.把慢指针后面的元素都置为0

解法二

1.定义变量k,k的初始值为0,表示[0,k)区间保存所有遍历过的非0元素

2.遍历数组,当遍历的元素是非0元素,就和k指向的0元素交换位置

3.有个优化点,就是当k等于i的时候,不需要交换位置

4.最后返回数组

下面以解法二为例写下代码:

代码

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let k = 0; // nums中, [0...k)的元素均为非0元素
    // 遍历到第i个元素后,保证[0...i]中所有为非0元素
    // 都按照顺序排列在[0...k)中
    // 同时,[k...i]都为0
    for(let i =0;i<nums.length;i++){
        if(nums[i] !==0){
            if(k !== i){
               [nums[i],nums[k]] = [nums[k], nums[i]]
                k++
            }else{
                k++
            }
        }
    }
    return nums;
};