164 Maximum Gap 最大间距

给定一个无序的数组,找出数组在排序后相邻的元素之间最大的差值。
尽量尝试在线性时间和空间复杂度情况下解决此问题。
若数组元素个数少于2,则返回0。
假定所有的元素都是非负整数且范围在32位有符号整数范围内。

详见:https://leetcode.com/problems/maximum-gap/description/

Java实现:题目要求是要线性的时间和空间,那么只能用桶排序。同一个桶里的数差值不会有不同桶间的差值大,所以找桶内最大和下一个非空桶的桶内最小进行比较即可。

class Solution {
    public int maximumGap(int[] nums) {
        int n=nums.length;
        if (nums == null || n < 2){
            return 0;
        }
        // 计算数组中的最大值和最小值
        int min = nums[0];
        int max = nums[0];
        for (int num:nums) {
            min = min>num?num:min;
            max = max<num?num:max;
        }
        // the minimum possibale gap, ceiling of the integer division
        int gap = (int)Math.ceil((double)(max - min)/(n - 1));
        int[] bucketsMIN = new int[n - 1]; // 记录桶中的最小值
        int[] bucketsMAX = new int[n - 1]; // 记录桶中最大值
        Arrays.fill(bucketsMIN, Integer.MAX_VALUE);
        Arrays.fill(bucketsMAX, Integer.MIN_VALUE);
        // put numbers into buckets
        for (int num:nums) {
            if (num == min || num == max){
                continue;
            }
            int idx = (num - min) / gap; // index of the right position in the buckets
            bucketsMIN[idx] = Math.min(num, bucketsMIN[idx]);
            bucketsMAX[idx] = Math.max(num, bucketsMAX[idx]);
        }
        // scan the buckets for the max gap
        int maxGap = Integer.MIN_VALUE;
        int previous = min;
        for (int i = 0; i < n - 1; i++) {
            if (bucketsMIN[i] == Integer.MAX_VALUE && bucketsMAX[i] == Integer.MIN_VALUE){
                // 跳过空桶
                continue;
            }
            // min value minus the previous value is the current gap
            maxGap = Math.max(maxGap, bucketsMIN[i] - previous);
            // update previous bucket value
            previous = bucketsMAX[i];
        }
        maxGap = Math.max(maxGap, max - previous); // 更新最大间隔
        return maxGap;
    }
}

参考:https://www.cnblogs.com/grandyang/p/4234970.html

posted on 2018-04-06 18:23  lina2014  阅读(283)  评论(0编辑  收藏  举报

导航