164. Maximum Gap

Given an unsorted array, find the maximum difference between the successive elements in its sorted form.

Try to solve it in linear time/space.

Return 0 if the array contains less than 2 elements.

You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.


给一个没有排序的序列,要求求出排序后相邻的元素之差的最大值。要求用O(n)的时间复杂度和空间复杂度。不能简单的用sort排序然后计算,这样就不可能是O(n)。这里用桶排序。一开始我是直接用一个数一个桶(不在序列中的数也有桶)的方法,但[2,999999]这个例子超时了,因为差距有点大。为了缩小桶的数,要使用适当的桶大小,这里是序列有多少个数就有多少个桶,桶的大小即为均分Max-Min。每个桶都保存好在该桶中的最大值和最小值。这样最理想的情况是每个桶有一个数(这里指在序列中的数),这样两个数的距离就是一个桶的最小值和前一个桶的最大值的差,这样算最大值就可以。没那么理想的情况就是有些桶不只一个数,但这样肯定有某个桶缺了数,这个桶两边的相邻的数差比桶的大小还大,这样最大差肯定不在由两个或两个数以上的桶上产生。所以统一计算上一个有数的桶的最大值和下一个有数的桶的最小值,然后算最大值就能得到答案。


代码:

class Solution
{
public:
	int maximumGap(vector<int>& nums) 
	{
		int Max = INT_MIN, Min = INT_MAX, len = nums.size();
		if(nums.size() < 2) return 0;

		for(auto num:nums)
		{
			Max = max(Max, num);
			Min = min(Min, num);
		}

		int bucket_size = max(1, (Max - Min) / (len - 1));
		int bucket_num = (Max - Min) / bucket_size + 1;
		vector<int>bucket_cnt(bucket_num, 0);
		vector<int>bucket_max(bucket_num, INT_MIN);
		vector<int>bucket_min(bucket_num, INT_MAX);

		for(auto num:nums)
		{
			int bucket_id = (num - Min) / bucket_size;
			++bucket_cnt[bucket_id];
			bucket_min[bucket_id] = min(bucket_min[bucket_id], num);
			bucket_max[bucket_id] = max(bucket_max[bucket_id], num);
		}

		int pre = Min, res = 0;
		for(int i = 0; i < bucket_num; ++i)
		{
			if(bucket_cnt[i] > 0)
			{
				res = max(res, bucket_min[i] - pre);
				pre = bucket_max[i];
			}
		}
		return res;
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值