LintCode 最大间距

http://www.lintcode.com/zh-cn/problem/maximum-gap/

最大间距 查看运行结果

给定一个未经排序的数组,请找出其排序表中连续两个要素的最大间距。

如果数组中的要素少于 2 个,请返回 0.

您在真实的面试中是否遇到过这个题? Yes
样例
给定数组 [1, 9, 2, 5],其排序表为 [1, 2, 5, 9],其最大的间距是在 5 和 9 之间,= 4.

注意
可以假定数组中的所有要素都是非负整数,且最大不超过 32 位整数。

挑战
排序十分简单,但将使用 O(nlogn) 时间复杂度。请避免使用线性时间复杂度和空间。

代码:

class Solution {
    /**
     * @param nums: an array of integers
     * @return: the maximum difference
     */
   public int maximumGap(int[] nums) {
        if(null == nums || nums.length < 2)
        {
            return 0;
        }
        
        int length = nums.length;
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;   
        
        for(int i = 0;i < length;i++)
        {
            if(nums[i] < min)
            {
                min = nums[i];
            }
            
            if(nums[i] > max)
            {
                max = nums[i];
            }
        }
        // 桶的概念
        int bucketCapacity = (max - min) / length + 1;
        int bucketNumber = (max - min) / bucketCapacity + 1;
        int[] minBuckets = new int[bucketNumber];
        int[] maxBuckets = new int[bucketNumber];
        int maxDistance = 0;
        
        for(int i = 0;i < bucketNumber;i++)
        {
            minBuckets[i] = Integer.MAX_VALUE;
            maxBuckets[i] = Integer.MIN_VALUE;
        }
        
        for(int i = 0;i < length;i++)
        {
            int index = (nums[i] - min) / bucketCapacity;
            if(minBuckets[index] > nums[i])
            {
                minBuckets[index] = nums[i];
            }
            
            if(maxBuckets[index] < nums[i])
            {
                maxBuckets[index] = nums[i];
            }
        }
    
        int pre = 0;
        for(int i = 1;i < bucketNumber;i++)
        {
            if(minBuckets[i] == Integer.MAX_VALUE && maxBuckets[i] == Integer.MIN_VALUE)
                continue;
            if(minBuckets[i] - maxBuckets[pre] > maxDistance)
            {
                maxDistance = minBuckets[i] - maxBuckets[pre]; // 因为最大间距不可能在一个桶内,否则bucketNumber * maxDistance > length;
            }
            pre = i;
        }
        return  maxDistance;
    }
}
    原文作者:Arnold134777
    原文地址: https://www.jianshu.com/p/d3ba3f37e4d0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞