Maximum Gap

桶排序+鸽巢原理,这两部分知识都不是很熟悉,正好学习一下

class Solution {
public:
	int maximumGap(vector<int>& nums) {
		int n = nums.size();
		if (n < 2) return 0;
		int maxE = *max_element(nums.begin(), nums.end());
		int minE = *min_element(nums.begin(), nums.end());

		int len = maxE - minE;
		if (len <= 1) return len;//Handle coner case.
		vector<int> buck_max(n, INT_MIN);
		vector<int> buck_min(n, INT_MAX);

		for (int i = 0; i < n; i++) {
			// note the divide and multiply order and the double cast
			// it's used to avoid the overflow and underflow during calculation
			int index = (double)(nums[i] - minE) / len * (n - 1);
			buck_max[index] = max(buck_max[index], nums[i]);
			buck_min[index] = min(buck_min[index], nums[i]);
		}

		int gap = 0, pre = buck_max[0];
		for (int i = 1; i < n; i++) {
			if (buck_max[i] == INT_MIN) continue;//Skip empty buket.
			gap = max(gap, buck_min[i] - pre);
			pre = buck_max[i];
		}
		return gap;
	}
};

看完源代码后一直不了解所谓的相邻元素的最大差值不会小于ceiling[(B - A) / (N-1)],B是最大值,A是最小值,N是元素个数

直到看到了这个解释:

min + (n - 1)minStep = max
(n - 1)minStep = max - min
minStep = ceil((max - min) / (n - 1))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值