题目
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
示例1
输入: nums = [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
示例2
输入: nums = [2,0,1]
输出: [0,1,2]
题解
排序
一种取巧的方法,将数组排序输出即可;后来仔细看了原题,题目要求原地排序;尴尬
排序代码
var sortColors = function (nums) {
return nums.sort((a,b)=>a-b)
}
双指针
原地修改数据,数据分成三份;双指针呀。
- 左侧指针left指向0;
- 右侧指针right指向2
- 枚举数组,如果当前整数为0,将整数与left交换
- 如果整数为1,跳过
- 如果整数为2,将整数与right处整数交换,注意,交换后要判断一下right处过来的整数是多少
- 返回num
双指针代码
var sortColors = function (nums) {
const len = nums.length
let left = 0
let right = len - 1
let k = 0
while (k <= right) {
if (nums[k] === 0) {
const t = nums[k]
nums[k] = nums[left]
nums[left] = t
left++
k++
} else if (nums[k] === 1) {
k++
} else if (nums[k] === 2) {
const t = nums[k]
nums[k] = nums[right]
nums[right] = t
right--
}
}
return nums
}