给定数组,求排序之后相邻两个数的最大差值。【要求】:时间复杂度O(N),且不能用 非基于比较的排序。

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;

}

猜你喜欢

转载自blog.csdn.net/wx1458451310/article/details/88051445