一起养成写作习惯!这是我参与「掘金日新计划 · 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;
};