LeetCode(C语言) - 75. 颜色分类

https://leetcode.cn/problems/sort-colors/

提交代码1

void sortColors(int* nums, int numsSize){
	int a=0,b=0,c=0,i;
	for(i=0;i<numsSize;i++){
		if(nums[i]==0){
			a++;
		}else if(nums[i]==1){
			b++;
		}else if(nums[i]==2){
			c++;
		}
	}
	for(i=0;i<a;i++){
		nums[i]=0;
	}
	for(i=a;i<a+b;i++){
		nums[i]=1;
	}
	for(i=a+b;i<a+b+c;i++){
		nums[i]=2;
	}
}

执行结果

执行结果:
通过
显示详情
添加备注

执行用时:
0 ms
, 在所有 C 提交中击败了
100.00%
的用户
内存消耗:
6 MB
, 在所有 C 提交中击败了
26.90%
的用户
通过测试用例:
87 / 87

完整代码

#include <stdio.h>
void sortColors(int* nums, int numsSize){
	int a=0,b=0,c=0,i;
	for(i=0;i<numsSize;i++){
		if(nums[i]==0){
			a++;
		}else if(nums[i]==1){
			b++;
		}else if(nums[i]==2){
			c++;
		}
	}
	for(i=0;i<a;i++){
		nums[i]=0;
	}
	for(i=a;i<a+b;i++){
		nums[i]=1;
	}
	for(i=a+b;i<a+b+c;i++){
		nums[i]=2;
	}
}
main(){
//	int a[] = {2,0,2,1,1,0};
	int a[] = {2,0,1};
	
	int len = sizeof (a) / sizeof (int);
	
	for(int i=0;i<len;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	
	sortColors(a,len);
	
	for(int i=0;i<len;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
}

控制台输出

2 0 1
0 1 2

--------------------------------
Process exited after 0.5431 seconds with return value 0
请按任意键继续. . .

提交代码2:三路快排

思路:三路快排,这样优化的结果是,循环只走一遍就可以了。代码1需要走两遍循环。

三路快排学习:https://www.bilibili.com/video/BV1Kr4y187VP/

void sortColors(int* nums, int numsSize){
	int left=0,right=numsSize-1,i=0;
	while(i<=right){
		if(nums[i]==0){
			nums[i]=nums[left];
			nums[left] =0;
			i++;
			left++;
		}else if(nums[i]==1){
			i++;
		}else if(nums[i]==2){
			nums[i]=nums[right];
			nums[right] = 2;
			right--;
		}
	}
}

执行结果

执行结果:
通过
显示详情
添加备注

执行用时:
4 ms
, 在所有 C 提交中击败了
58.65%
的用户
内存消耗:
6 MB
, 在所有 C 提交中击败了
21.43%
的用户
通过测试用例:
87 / 87
posted @ 2022-05-12 21:36  孤舟浮岸  阅读(103)  评论(0)    收藏  举报