zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    spring mvc 数据回显
    spring mvc 数据校验
    如何构建高性能web站点之:分布式缓存
    面霸吕国栋之:整理的一些面试题
    项目中我为什么用Mongodb取代Mysql
    对mysql存储性能优化的基本理解
    SQL语句面试题(IN、NOT IN、COUNT、GROUP BY)
    java面试题
    java中的网络通信编程之UDP篇
    java中的网络通信编程之TCP篇
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8728428.html
Copyright © 2011-2022 走看看