一、题目:75. 颜色分类
二、题目解析:
- 借助一个 int[] bucket 来记录每个数字出现的次数,例如: 如果 5 出现了3次,那么 bucket[5] 就等于3。
- 基于这样,我们只需要遍历一次 nums[] ,就能得出每个数字到底有几个,然后再遍历 bucket[] 将其中的数字依次按照数量取出来。
- 注意:假设我们有一个数 21474843647 ,那就意味着 bucket[] 的大小就是21474843647 ,桶排的时间复杂度不仅仅由 nums[] 的长度决定,还由 nums[] 的值域范围决定,但是这道题目, nums[i] 的可能取值只有 0,1,2,所以我们可以放心大胆地使用桶排。
三、代码实现:
public void sortColors(int[] nums) {
//定义桶的固定大小,不然会产生下标越界情况
int[] bucket = new int[3];
//将nums放入桶的对应下标位置
for(int num:nums) bucket[num]++;
//遍历桶里的第一个元素
for(int i = 0;i<bucket[0];i++) nums[i] = 0;
//遍历桶里的第二个元素
for(int i = bucket[0];i<bucket[0]+bucket[1];i++) nums[i] = 1;
//遍历桶里的第三个元素
for(int i = bucket[0]+bucket[1];i<bucket[0]+bucket[1]+bucket[2];i++) nums[i] = 2;
}
五、测试结果:
六、结束