LeetCode 75. 颜色分类
方法一:计数重排法(直观易理解)
核心思路:先统计数组中 0、1、2 各自的出现次数,再按顺序将 0、1、2 依次填充回数组。
Java 代码实现:
class Solution {
public void sortColors(int[] nums) {
int count0 = 0, count1 = 0, count2 = 0;
// 1. 统计各颜色数量
for (int num : nums) {
if (num == 0) count0++;
else if (num == 1) count1++;
else count2++;
}
// 2. 按顺序填充数组
int i = 0;
while (count0-- > 0) nums[i++] = 0;
while (count1-- > 0) nums[i++] = 1;
while (count2-- > 0) nums[i++] = 2;
}
}
方法二:三指针法(荷兰国旗问题,一趟扫描,O(1) 空间)
核心思想:用三个指针 p0、p1、p2 划分区间:
[0, p0):全是 0[p0, p1):全是 1(p2, n-1]:全是 2[p1, p2]:待处理区间
遍历数组时,根据 nums[p1] 的值进行交换,逐步收缩待处理区间。


