给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

思路

  1. cursor0 = 0, cursor2 = nums.length - 1
  2. 遍历数组一次,将元素 0 和 2 分别与相关游标交换,而后游标相向前进一格
1
2
3
4
5
6
7
8
9
10
11
12
13
var sortColors = function (nums) {
let [cursor0, cursor2] = [0, nums.length - 1]
for (let i = 0; i <= cursor2; ++i) {
while (i <= cursor2 && nums[i] === 2) {
;[nums[i], nums[cursor2]] = [nums[cursor2], nums[i]]
--cursor2
}
if (nums[i] === 0) {
;[nums[i], nums[cursor0]] = [nums[cursor0], nums[i]]
++cursor0
}
}
}