问题

给定一个包含红色、白色和蓝色,一共 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]

示例 3:

输入:nums = [0]
输出:[0]

示例 4:

输入:nums = [1]
输出:[1]


提示:

n == nums.length
1 <= n <= 300
nums[i] 为 0、1 或 2

思路

先定义一个数组只存放三个数,保存0,1,2三个数出现的频率
然后根据出现的频率来依次遍历

此类问题比较特殊,可以不使用排序算法,如果没有思路,也可以使用快排实现

代码实现

  1. public void sortColors(int[] nums) {
  2. //保存0,1,2三个数出现的频率
  3. int[] count = {0, 0, 0};
  4. for (int i = 0; i < nums.length; i++) {
  5. count[nums[i]]++;
  6. }
  7. //记录下标
  8. int index = 0;
  9. for (int i = 0; i < count[0]; i++) {
  10. nums[index++] = 0;
  11. }
  12. for (int i = 0; i < count[1]; i++) {
  13. nums[index++] = 1;
  14. }
  15. for (int i = 0; i < count[2]; i++) {
  16. nums[index++] = 2;
  17. }
  18. }