leetcode-024-164. 最大间距

164. 最大间距

给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。

如果数组元素个数小于 2,则返回 0。

示例 1:

输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。

示例 2:

输入: [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。

说明:

    你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
    请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。

说明部分清晰的表达了这道题目需要用基数排序。C++库模板的 sort 函数完全满足这一条件,但我还是自己写了一份还没写对,后来还是查资料,复习了一边基数排序,勉强写出来:

  1. 之前的思路,把数字按照个位数分到每个桶,按照每个桶在进行桶排序,之后合并。相当于桶排序+归并排序。很不好意思的是没写好。实际上这个效果也并一定不好,因为还是要用那么多桶。
  2. 比较好理解的做法:
    先对个位 基数排序(全部元素)
    再对十位 基数排序(全部元素)
class Solution {
public:

typedef vector<int>::iterator iterator;

void copy(iterator org_s, iterator org_e, iterator trg) {
	for (; org_s != org_e; trg++,org_s++)
		*trg = *org_s;
}

void bucketSort(iterator start, iterator end, int bit=1) {
	bool flag = true;
	for (vector<int>::iterator it = start; it != end; it++)
		if (*it >= bit)
			flag = false;
	if(flag == true)
		return;
	
	vector<int> buckets[10];

	for (iterator it = start; it != end; it++)
		buckets[(*it/bit)%10].push_back(*it);
	
	
	iterator it = start;
	for(int i=0; i<10; i++)
		if (!buckets[i].empty()) {
			copy(buckets[i].begin(), buckets[i].end(), it);
			it = it + buckets[i].size();
		}
			
	bucketSort(start, end, bit * 10);
}

    int maximumGap(vector<int>& nums) {
        if(nums.size() <2)
            return 0;
		// C++ 库函数排序
        // sort(nums.begin(), nums.end());
        bucketSort(nums.begin(), nums.end());

        
        iterator it=nums.begin();
        int max = 0;
        for(it = it+1; it!=nums.end(); it++) {
            int tmp = *it - *(it-1);
            max = tmp>max?tmp:max;
        }
        return max;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值