求Maximim Gap 排序后的两个相邻元素之间的最大差值

博客探讨了如何在O(n)复杂度下找到排序后数组中相邻元素的最大差值,指出计数排序会超时,建议使用桶排序。通过计算平均间隔并划分桶,确定每个元素所属的桶,从而找到最大Gap。

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

方法、桶排序

为了满足O(n)复杂度,尝试计数排序,但是会TLE。因此使用桶排序来做

计数排序可以看做是桶大小为1的桶排序,但由于桶数目太多导致遍历时间过长

最大gap肯定是出现在后一个有效桶的min与前一个有效桶的max之间

(“有效”指的是忽略空桶)

步骤思路:

1、数组中有N个元素,最小元素为min、最大元素为max

2、平均间隔为gap = ceil( (max - min) / (N - 1))  ceil指结果向上取整

3、总共分成 bucketCount =ceil((max - min)/ gap ) 个区间(一个区间也就是一个桶),每个区间元素范围是 [ min + k * gap , min + (k + 1) * gap )

4、每个元素对应的桶号(区间)为  bucketNum = (kVal - min)/ gap

桶排序,由于num中的数字肯定在[min,max]区间内

所以根据抽屉原理,假设num中有n个数字,则最大的gap必然要大于dis=(max-min)/(n-1)

所以我们可以把num所在的范围分成等间隔的区间,相邻区间内的元素之间的最大差值,即为要寻找的gap

class MaxDivision {
public:
	int findMaxDivision(vector<int> A, int n) {
		if (n < 2)
			return 0;
		// write code here
		int max_val = *max_element(A.begin(), A.end());
		int min_val = *min_element(A.begin(), A.end());

		//平均间距一定要向上取整,只能多不能少,因为少了会导致计算桶号时比实际的偏大以至于超过桶数
		int avg_gap = ceil((double)(max_val - min_val) / (n - 1));

		//first is the min value of this bunket,second is the max value of this bunket
		//桶的数量直接 n - 1 就行了
		vector<std::pair<int, int>> bunket(n - 1, make_pair(INT_MAX, INT_MIN));

		for (auto num : A) {
			if (num == max_val || num == min_val)
				continue;
			int bunket_num = (num - min_val) / avg_gap;
			if (num < bunket[bunket_num].first)
				bunket[bunket_num].first = num;
			if (num > bunket[bunket_num].second)
				bunket[bunket_num].second = num;
		}

		int maxGap = 0; //return value
		int lastMax = min_val;
		for (auto val : bunket) {
			if (val.first == INT_MAX)
				continue;
			int tmp = val.first - lastMax;
			maxGap = tmp > maxGap ? tmp : maxGap;
			lastMax = val.second;
		}
		int tmp = max_val - lastMax;
		maxGap = tmp > maxGap ? tmp : maxGap;
		return maxGap;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值