Maximum Gap LeetCode

这道题基数排序可以做,但是放在这里肯定有其它巧妙的方法,看了别人的解答是桶排序。

但是桶内的数据怎么处理呢,万一最大差值出现在桶内呢?

这里巧妙就巧妙在这里:

选取了一个合适的桶大小,当数据平均分布于每个桶时,每个桶恰好一个,桶间差值产生最大差值;当数据不均匀时,会出现空桶,空桶左右数据的差值,必然超过桶内的差值。


还有一种理解:

任意n个数据,其最大差值必然不小于其平均分布时的差值,即(max-min)/(n-1)。选取这个值作为桶的大小,则最大差值可以由桶间来计算得到。

class Solution {
	struct bucket{
		int min,max;
		bucket():min(INT_MAX),max(INT_MIN){}
	};
public:
	int maximumGap(vector<int> &num) {
		if (num.size()<2) return 0;
		int minV=INT_MAX,maxV=INT_MIN;
		for (int i=0;i<num.size();++i){
			if (maxV<num[i]) maxV=num[i];
			if (minV>num[i]) minV=num[i];
		}
		int bucket_size=(maxV-minV)/(num.size()-1);
		if ((maxV-minV)%(num.size()-1)!=0) ++bucket_size;
		int bucket_num=(maxV-minV)/bucket_size+1;
		vector<bucket> bks(bucket_num);
		for (int i=0;i<num.size();++i){
			int id=(num[i]-minV)/bucket_size;
			if (bks[id].min>num[i]) bks[id].min=num[i];
			if (bks[id].max<num[i]) bks[id].max=num[i];
		}
		int left_max=minV,maxGap=0;
		for (int i=0;i<bks.size();++i){
			if (bks[i].min!=INT_MAX){
				if (bks[i].min-left_max>maxGap) maxGap=bks[i].min-left_max;
				left_max=bks[i].max;
			}
		}
		return maxGap;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值