颜色分类
题目:颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
看到0、1、2的顺序我们想到的方法就是对数组nums进行排序,不管冒泡、快排还是其它方法手撸一个排序就行,所以这里使用排序以外的方法来解决这个问题。
因为只有三种数字,我们可以将0和2的数字抽出来,再将对应的0和1添加到nums的首尾即可,代码如下:
var sortColors = function(nums) {
// 2的数量
let num2 = 0
// 0的数量
let num0 = 0
for(let i = 0; i < nums.length; ) {
if (nums[i] == 2) {
nums.splice(i, 1);num2++
} else if(nums[i] == 0) {
nums.splice(i, 1);num0++
}else {
i++
}
}
// 将0、2分别添加到首尾
nums.unshift(...new Array(num0).fill(0))
nums.push(...new Array(num2).fill(2))
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
通过上面代码可以发现,使用Array.fill可以重置数组值,那么我们可以统计0、1、2的数量再使用fill方法重置数组值,修改上面代码如下:
ar sortColors = function(nums) {
// 2的数量
let num2 = 0
// 0的数量
let num0 = 0
for(let i = 0; i < nums.length; i++) {
nums[i] == 2 && num2++
nums[i] == 0 && num0++
}
// 将0、2分别添加到首尾
nums.fill(0, 0, num0)
nums.fill(1, num0, nums.length - num2)
nums.fill(2, nums.length - num2, nums.length)
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上次更新: 2025/09/05, 8:09:00