介绍
Hi 大家好。我是程序员库里,今天新开一个前端算法专栏。
接下来会分类给大家分享常考算法题目。
很多朋友也是看着这套系列算法拿到很多offer!所以也是想分享给更多朋友,帮助到有需要的朋友。
分类
数组-三路快排
题目
给定一个包含红色、白色和蓝色、共 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就移动到了右边,这个时候不能将 i 向右移动一位,需要继续判断 当前这个元素是否为0
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;
};