一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
Hi, 大家好。我是新人,程序员库里。
今后会按类分享算法题。
今天给大家分享第5道leetcode上数组中使用双指针相关的算法题。
80.删除有序数组中的重复项 II
leetcode地址:leetcode-cn.com/problems/so…
难度
中等
描述
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。
示例1
输入: nums = [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
示例2
输入: nums = [2,0,1]
输出: [0,1,2]
解法
1.定义一个变量zero,初始值为-1,zero变量用来表示[0...zero]区间全部放0
2.定义一个变量two,初始值为数组的长度,two变量用来表示[two...n-1]区间全部放2
3.[zero+1...n-1]区间全部放1,这样数组中就变成了[0....1....2]
4.开始遍历数组,条件是当i小于数组长度的时候
5.如果遍历的当前元素是1,只把i向右移动一位,即i++。因为 1是在数组的中间,所以不做其他操作。
6.如果遍历的当前元素是2,先将变量two向左移动一位,腾出一个位置,也就是two--。然后将当前的元素2和two所在的位置交换一下位置,此时这个2就移动到了右边
7.如果遍历的当前元素是0,先将zero向右移动一位,腾出一个位置,也就是zero++。然后将当前的元素0和zero所在的位置交换一下位置,此时这个0就移动到了左边。然后继续遍历,即i++。
8.遍历完一遍后,所有0就到了左边,所有2就到了右边,所有1就到了中间。即完成了数组排序。
代码
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var sortColors = function(nums) {
let zero = -1;// [0...zero] 为0,弄成无效区间
let two = nums.length;// [two...n-1] 为2,弄成无效区间
for(let i =0;i<two;){
if(nums[i] === 1){
i++
}else if(nums[i] === 2){
two--
[nums[i],nums[two]] = [nums[two],nums[i]]
}else if(nums[i] === 0){
zero++
[nums[i],nums[zero]] = [nums[zero],nums[i]]
i++
}
}
return nums;
};