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;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,755评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,248评论 0 52
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,792评论 0 33
  • 该文章总结自牛课网的在线算法课程(https://www.nowcoder.com/) 经典排序算法就是前面讲那几...
    锅与盆阅读 7,792评论 6 14
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 2,327评论 0 35