LeetCode 164 最大间距

1.这个排序+比较

class Solution {
    public int maximumGap(int[] nums) {
        if(nums.length<2) return 0;
        Arrays.sort(nums);
        int max=0;
        for(int i=1;i<nums.length;i++){
            max=Math.max(max,nums[i]-nums[i-1]);
        }
        return max;
    }
}

我才开始还以为这种做法会超时,现在我也不是很理解了

2.桶排序

class Solution {
    public int maximumGap(int[] nums) {
        if(nums.length<2) return 0;
        int max=nums[0],min=nums[0];
        int n=nums.length;
        for(int i=1;i<n;i++){
            max=Math.max(max,nums[i]);
            min=Math.min(min,nums[i]);
        }
        if(max==min) return 0;
        int interval=(int) Math.ceil((double)(max - min) / (n - 1));
        int[] maxArr = new int[n-1];
        int[] minArr = new int[n-1];
        Arrays.fill(maxArr,-1);
        Arrays.fill(minArr,Integer.MAX_VALUE);
        for(int i=0;i<n-1;i++){
            if(nums[i]==min||nums[i]==max){
                continue;
            }
            int index = (nums[i]-min)/interval;
            maxArr[index]=Math.max(maxArr[index],nums[i]);
            minArr[index]=Math.min(minArr[index],nums[i]);
        }
        int maxGap=0;
        int preMax=min;
        for(int i=0;i<n-1;i++){
            if(maxArr[i]==-1) continue;
            maxGap=Math.max(maxGap,minArr[i]-preMax);
            preMax=maxArr[i];
        }
        maxGap=Math.max(maxGap,max-preMax);
        return maxGap;
    }
}

 

 这个桶排序确实挺复杂的,我感觉

以1,3,6,9为例,来举例说

对数字进行桶排序,就是放一排桶,每个桶中存放一个范围内的数字,这个范围和桶的个数由数组的最大值,最小值和数组长度控制

想象一下  1,     3,6,           9这个是3个有顺序的桶,如果想要得到最大差值,只要用当前桶的最小值减去上一个桶的最大值,就可以得到一个值,这个值可能就是最大差值

那么,这个范围和桶的个数是怎么得来的呢?

首先桶的个数应该有nums.length-1   首先我们可以去掉数组的最大值和最小值,因为最小值和最大值不需要参与这个最大差值的计算,主要参与的是两个桶之间的最小值,最大值,这时还有n-2个数

接下来,还必须保证有一个空箱子,这个空箱子可以保证,两个箱子之间的差值一定大于箱子内部的差值

2  空箱子  45   7  4-2肯定大于箱子内部的差值

当这些想明白了之后,就是操作了

用两个数组maxArr,minArr分别记录各个第i个桶的最大值最小值,遍历

在得到maxArr,minArr后,就计算两个桶的差值 preMax就象征着上一个桶的最大值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值