有n个数,取值范围非常大,导致不能使用桶排序,所以用一个类似于桶的取巧的办法
规则:有N个数,则生成n+1个桶,把数的取值范围分为到这n+1个桶中, 遍历n个值,把每个值都放入到对应范围的桶里,
从而, 目标要求的差值必定在两桶之间。
因此:我们先求每一个桶的最大值与最小值,求好后,
再遍历每一个有值得桶,后用一个桶的最小值减去前一个桶的最大值,得到一个差值,
最终输出最大的差值
#include<algorithm>
#include<iostream>
#include<climits>
using namespace std;
int tong(int arr[],int length);
int bucket(int num, int length,int min, int max);
int main(){
int arr[] = {1,4,5,7,9,22,34,45};
cout << tong(arr, 8);
return 0;
}
int tong(int* arr,int length){
if(arr == nullptr || length ==0)
return 0;
int min_ = INT_MAX;
int max_ = INT_MIN;
for(int i=0; i< length;i++){
min_ = min(arr[i],min_);
max_ = max(arr[i],max_);
}
if(min_ == max_)
return 0;
bool* hasnum = new bool[length+1];
int* mins = new int[length+1];
int* maxs = new int[length+1];
int bid=0;
for(int i=0;i<length;i++){
bid = bucket(arr[i],length,min_,max_);
mins[bid] = hasnum[bid]? min(mins[bid],arr[i]) : arr[i];
maxs[bid] = hasnum[bid]? max(maxs[bid],arr[i]) : arr[i];
hasnum[bid] = true;
// cout << mins[bid] << endl;
// cout << maxs[bid]<<endl;
}
int res=0;
int lastMax = maxs[0];
for(int i=1;i<=length;i++){
if(hasnum[i]){
res = max(mins[i]-lastMax, res);
lastMax = maxs[i];
}
}
return res;
}
int bucket(int num, int length,int min, int max){
return (int)((num-min)*length / (max-min));
}