【LeetCode刷题之旅】75 Sort Colors【C++】

本文对比了两种在数组中对颜色进行排序的算法——暴力解法和三路快速排序法。详细介绍了每种方法的实现过程,包括使用计数数组记录元素频率的暴力解法,以及仅遍历一次数组的三路快速排序法。尽管后者理论上更优,但实际运行时间可能更长。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

听老师讲课,把所述的两种方法记录下来。

第一种是暴力解法:

class Solution {
public:
	//时间复杂度:O(n)
	//空间复杂度:O(k),k为元素的取值范围
	 
    void sortColors(vector<int>& nums) {
    	
    	int count[3] = {0};		//存放0,1,2三个元素的频率的数组
    	for (int i = 0; i < nums.size(); i++){
    		assert(nums[i] >= 0 && nums[i] <= 2);
    		count[nums[i]] ++;
		} 
		
		int index = 0;
		for (int i = 0; i< count[0];i++)
			nums[index++] = 0;
		for (int i = 0; i< count[1];i++)
			nums[index++] = 1;
		for (int i = 0; i< count[2];i++)
			nums[index++] = 2;
		
		 
        
    }
};

 

第二种是三路快排:

 

 

class Solution {
public:
	//时间复杂度:O(n)
	//空间复杂度:O(1)
	//只遍历了一遍 
    void sortColors(vector<int>& nums) {
    	
    	int zero = -1;					// nums[0...zero] = 0,设置为-1表示此区间此时无效,没有任何一个元素
		int two = nums.size();			// nums[two...n-1] = 2,设置为nums.size()而不是num.size()-1,是因为此时无效
		for ( int i = 0; i< two ; ){
			if ( nums[i] == 1)
				i++;
			else if (nums[i] == 2){
				two --;
				swap( nums[i] , nums[two]);	//这两句也可合并成为: swap( nums[i] , nums[--two])
			}
				
			else{						// nums[i] == 0
				assert(nums[i] == 0);	//捕捉其他数值的异常输入
				zero ++;
				swap( nums[zero] , nums[i]);	//这三句可写成 swap( nums[++zero] , nums[i++])
				i++;				
			}
		} 
  	}
};

很奇怪,明明只遍历了一遍数组,时间却比暴力解法还要多。。。

还希望大佬告诉我下…… 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值