# 问题
首先我们一起来看一道 LeetCode
上的算法题目,Sort Colors (opens new window) 来自微软和 Facebook 的一道面试题。
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
1
2
2
如果是你在面试中遇到这道问题,你会怎么来解呢?我们当然可以在不利用特定条件(只有红色、白色和蓝色)下使用一个快速排序来解决这道问题。算法通常要先可解(暴力手段)再优化(更低的时间复杂度和空间复杂度)。
# 思考
由于这个问题中元素的种类较少(此题中只有三种元素),那么我们可以考虑先为这些元素计数。之后再来根据计数来输出结果。
# 解题
class Solution {
public void sortColors(int[] nums) {
// count[0] 记录 0 出现的次数 count[1] => 1的次数 count[2] => 2 的次数
int [] count = new int[3];
for (int i = 0; i < nums.length; i++) {
if(nums[i] == 0)
count[0]++;
else if(nums[i] == 1)
count[1]++;
else
count[2]++;
}
int idx = 0;
for (int i = 0; i < count.length; i++) {
for (int j = 0; j < count[i]; j++) {
nums[idx] = i;
idx++;
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 输出
[0,0,1,1,2,2]
# 图示
Gif Power By https://visualgo.net (opens new window)