2018-08-22 LeetCode164. 最大间距(桶排序)

给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 2,则返回 0。

class Solution {
    public int maximumGap(int[] nums) {
        if(nums.length < 2) return 0;
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        int n = nums.length;
        for (int d: nums) {
            max = Math.max(max, d);
            min = Math.min(min, d);
        }
        int size = (max - min) / n + 1;//桶大小
        int bucket_nums = (max - min) / size + 1;//桶个数
        int []bucket_min = new int[bucket_nums];
        int []bucket_max = new int[bucket_nums];
        for(int i = 0; i < bucket_nums; i++){
            bucket_min[i] = Integer.MAX_VALUE;
            bucket_max[i] = Integer.MIN_VALUE;
        }
        HashSet<Integer> hs = new HashSet<Integer>();
        for (int d : nums) {
            int idx = (d - min) / size;//桶索引
            bucket_min[idx] = Math.min(bucket_min[idx], d);
            bucket_max[idx] = Math.max(bucket_max[idx], d);
            hs.add(idx);
        }
        int pre = 0;
        int res = 0;
        for (int i = 1; i < bucket_nums; ++i) {
            if (!hs.contains(i)) continue;//判断桶内是否有元素
            res = Math.max(res, bucket_min[i] - bucket_max[pre]);
            pre = i;
        }
        return res;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。 给定二叉树的根结点root,请返回打印结果,结果按照...
    Crystalajj阅读 9,493评论 0 2
  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 5,834评论 0 2
  • 今年的雪季,没有你暖心的笑容,今天的伤感,没有你掌心的余温,,,,,, 新的一年新的浮夸,矫情的岁月里,明明懂得却...
    北纬以北丶未阅读 1,501评论 0 0
  • 你是九月夏天滚烫的浪 你是忽而大雨瓢泼的向往 你是飞越山川河流的大梦一场 你是整夜白...
    艾尚萱阅读 2,675评论 2 3
  • 光着脚,坐在窗前,看着外面,感觉很安静,内心很平和,这是属于我自己一个人的时光,真好。 我可以整理自己繁杂的思绪,...
    南木的小屋阅读 4,668评论 2 0