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

本文介绍了一种求解排序后数组中相邻两数最大差值的算法,使用桶排序思想,确保时间复杂度为O(N)。通过计算每个桶内的最小值和最大值,并在遍历所有桶的过程中更新差值,最终找到最大差值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定数组,求排序之后相邻两个数的最大差值。【要求】:时间复杂度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;

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值