这道题基数排序可以做,但是放在这里肯定有其它巧妙的方法,看了别人的解答是桶排序。
但是桶内的数据怎么处理呢,万一最大差值出现在桶内呢?
这里巧妙就巧妙在这里:
选取了一个合适的桶大小,当数据平均分布于每个桶时,每个桶恰好一个,桶间差值产生最大差值;当数据不均匀时,会出现空桶,空桶左右数据的差值,必然超过桶内的差值。
还有一种理解:
任意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;
}
};