版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wx1458451310/article/details/88051445
给定数组,求排序之后相邻两个数的最大差值。【要求】:时间复杂度O(N),且不能用 非基于比较的排序。
C++实现:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int bucket(int num,int len,int min,int max)
{
return (int)( (num-min)*len/(max-min) );
}
int Max_Gap(vector<int> arr)
{
int len = arr.size();
if(len<2)
return 0;
int min_data = *min_element(arr.begin(),arr.end());
int max_data = *max_element(arr.begin(),arr.end());
//cout<<min_data<<" "<<max_data<<endl;
if(min_data == max_data)
return 0;
vector<bool> hasnum(len+1);
vector<int> maxs(len+1);
vector<int> mins(len+1);
//bool *hasnum = new bool[len+1];
//int *maxs = new int[len+1];
//int *mins = new int[len+1];
int bid=0;
for (int i=0;i<len;i++)
{
bid = bucket(arr[i],len,min_data,max_data);
cout<<"-----"<<bid<<"-----"<<endl;
mins[bid] = hasnum[bid] ? min(arr[i],mins[bid]) : arr[i];
maxs[bid] = hasnum[bid] ? max(arr[i],maxs[bid]) : arr[i];
hasnum[bid] = true;
}
int res = 0;
int lastmax = maxs[0];
for (int i=1;i<=len;i++)
{
if (hasnum[i])
{
res = max(res, mins[i]-lastmax);
lastmax = maxs[i];
}
}
return res;
}
int main()
{
vector<int> arr;
int n,temp;
cin>>n;
for (int i=0;i<n;i++)
{
cin>>temp;
arr.push_back(temp);
}
int res = Max_Gap(arr);
cout<<res<<endl;
system("pause");
return 0;
}