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

  • 相关阅读:
    JDBC存取二进制文件示例
    java多线程向数据库中加载数据
    Lucene建索引代码
    postgresql存储二进制大数据文件
    java项目使用Echarts 做柱状堆叠图,包含点击事件
    子页面获取父页面控件
    JSTL和select标签的组合使用
    log4j配置祥解
    IT项目经理应具备的十大软技能
    Spring和Struct整合的三个方法
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8728428.html
Copyright © 2011-2022 走看看