LeetCode--75.颜色分类(C)
程序员文章站
2022-06-03 11:20:46
...
1. 题目描述
难度:中等
2. 题目解析
这道题需要注意一下几点:
- 原地进行排序,不可以另外申请数组空间。
- 数组元素最多只有三个元素0, 1, 2,但是要考虑空数组和单个元素的例子
有两种方法:
-
计数排序法
遍历出0,1,2元素的个数,然后按照这个个数重新写入数组,时间复杂度为O(n). -
三路快排法
三路快排思想,就是大于1的放右边,小于1的放左边,等于1的不动,这样只遍历一遍就可以了,时间复杂度为O(n)
3. C语言实现
3.1 三路快排法
代码如下:
// 交换两个对象
void swap(int* nums, int a, int b){
int temp;
temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
void sortColors(int* nums, int numsSize){
int i, left, right;
i = 0;
left = -1;
right = numsSize;
while(i < right){
// 如果元素=0,将该元素放在数组前面
if(nums[i] == 0){
left++;
swap(nums, i, left);
i++;
}
// 如果元素=2,将元素放在数组后面
else if(nums[i] == 2){
right--;
swap(nums, right, i);
}
else
i++;
}
}
运行结果为:
3.2 计数排序法
代码如下:
void sortColors(int* nums, int numsSize){
int i, r=0, w=0, b=0;
for(i = 0; i < numsSize; i++){
if(nums[i] == 0) r++;
else if(nums[i] == 1) w++;
else b++;
}
for(i = 0; i < numsSize; i++){
if(i < r) nums[i] = 0;
else if(i >= r && i < r+w) nums[i] = 1;
else nums[i] = 2;
}
}
运行结果为:
上一篇: Leetcode-228-Summary Ranges
下一篇: DotNet 资源大全(上)