leetcode 164. 最大间距

160 阅读1分钟

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

 示例 1:

输入: [3,6,9,1] 

输出: 3 

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

示例 2: 

 输入: [10] 

输出: 0 

解释: 数组元素个数小于 2,因此返回 0。 

说明:  

你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。

请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。 



代码:

class bucket{
    int max=0;
    int min=Integer.MAX_VALUE;
}

class Solution {
    public int maximumGap(int[] nums) {
        if(nums.length<=1)
            return 0;
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for(int i:nums){
            max = Integer.max(max,i);
            min = Integer.min(min,i);
        }
        int bucketSize = Integer.max(1,(max-min)/(nums.length-1));
        bucket[] buckets = new bucket[(max-min)/bucketSize+1];
        for(int i=0;i<nums.length;++i){
            int index = (nums[i]-min)/bucketSize;
            if(buckets[index]==null){
                buckets[index] = new bucket();
            }
            buckets[index].min = Integer.min(nums[i],buckets[index].min);
            buckets[index].max = Integer.max(nums[i],buckets[index].max);
        }
        int previousMax = Integer.MAX_VALUE;
        int result = Integer.MIN_VALUE;
        for(int i=0;i<buckets.length;++i){
            if(buckets[i]!=null&&previousMax!=Integer.MAX_VALUE){
                result = Integer.max(buckets[i].min-previousMax,result);
                previousMax = buckets[i].max;
            }
            if(buckets[i]!=null){
                result = Integer.max(buckets[i].max-buckets[i].min,result);
                previousMax = buckets[i].max;
            }
        }
        return result;
    }
}