[LeetCode][H0164]最大间距(Java)(桶排序)

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

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

示例 1:

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

示例 2:

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

说明:

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

反思错误:

①int b = 10 ; long a = Integer.MAX_VALUE*b;  输出a,,这样答案是-10!!!!

    而把其中一个int值改成long,,就没事了!!!例如:long a = Integer.MAX_VALUE*(long)b,,就行。

②桶排序中计算桶的id问题,,一共应该有 总个数+1 种可能————————例如:1、2、3…………len=3

     id=(1-1)/(3-1)*len=0…………(3-1)/(3-1)*len=3——————0~3,四个桶id

解题思路:

桶排序,首先想想有一个个大桶并列放着…………

好了,我们要把我们的数num 减去 最小值min 然后除以 最大值与最小值的差值 再乘以长度(这是在求放在哪个编号的桶中),

我们再去求桶中的数的最大值和最小值,,也就是桶的左右边界::::::

那么问题来了,在反思错误中我们必须要建len+1个桶,而且0号桶和len号桶必定放数(看看上边反思错误我求的,最小的在0,最大的在len),那么必然有桶是空的,

好,简单了。————

我们只需要求每个有数的桶的最小值  减去  上个有数桶的最大值,总会遇到空桶的(但是别直接去找空桶啊,万一空桶有好几个呢),纪录最大的差值就是答案。。

 

Java代码:

//执行用时 : 7 ms, 在Maximum Gap的Java提交中击败了63.09% 的用户
//内存消耗 : 41.1 MB, 在Maximum Gap的Java提交中击败了0.00% 的用户
class Solution {
    public int maximumGap(int[] nums) {
        int len = nums.length;
        if(len < 2) return 0;
        int min = nums[0],max = nums[0];
        for(int num : nums){
            min = min < num ? min : num;
            max = max > num ? max : num;
        }
        if(min == max) return 0;
        int[] minbucket = new int[len+1];
        int[] maxbucket = new int[len+1];
        boolean[] hasbucket = new boolean[len+1];
        for(int num:nums){
            int bucketid = bucketid(max,min,len,num);
            maxbucket[bucketid] = hasbucket[bucketid] ? Math.max(num,maxbucket[bucketid]):num;
            minbucket[bucketid] = hasbucket[bucketid] ? Math.min(num,minbucket[bucketid]):num;
            hasbucket[bucketid] = true;
        }
        int res = 0,cur = min;
        for(int i=0;i<=len;++i){
            if(hasbucket[i]){
                res = Math.max(res,minbucket[i]-cur);
                cur = maxbucket[i];
            }
        }
        return res;
    }
    int bucketid(int max,int min,long len,int num){
        long cur = (num - min) * len;
        return (int)(cur/(max - min));
    }
}

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值