给定一个数组, 求如果排序之后, 相邻两数的最大差值, 要求时
间复杂度O(N), 且要求不能用非基于比较的排序。
int bucket(int num, long max, long min, int len)
{
return ((num-min)*len / (max - min));//将len个数均匀的分到len+1个桶中
}
int bigdif(vector<long> arr)
{
long Max = LONG_MIN,Min = LONG_MAX;
for (long var : arr)
{
Max = max(var, Max);
Min = min(var, Min);
}
vector<long> Maxarr(arr.size() + 1, LONG_MIN);//分为Len+1个桶必存在一个空桶,然后我们只需要判断相邻桶之间最大值和最小值的差值就可以判断最大差值是什么了,而不需要判断桶内部之间的差值。
vector<long> Minarr(arr.size() + 1, LONG_MAX);
vector<bool> ishave(arr.size() + 1, 0);
for (long var : arr)
{
int dex = bucket(var, Max, Min, arr.size());
Maxarr[dex] = max(Maxarr[dex], var);
Minarr[dex] = min(Minarr[dex], var);
ishave[dex] = 1;
}
long maxnum = Maxarr[0];
long res = 0;
for (int i = 1; i < arr.size() + 1; i++)
{
if (ishave[i])
{
res = max(res, Minarr[i] - maxnum);
maxnum = Maxarr[i];
}
}
return res;
}