• 164. 最大间距_数组_困难


    class Solution {
        public int maximumGap(int[] nums) {
            if(nums.length <2) return 0;
            else{
                Arrays.sort(nums);
                int array[] =  new int[nums.length-1];
                for(int i=0;i<nums.length-1;i++){
                    array[i] = nums[i+1] - nums[i];
                }
                Arrays.sort(array);
                return array[array.length-1];
            } 
        }
    }

    使用桶排序:思路是利用每个桶内的最大和相邻的非空桶的最小值最进行计算gap,得到最大的就可以,桶间隔设置为n-1就可以,再小一点也可以。

    class Solution {
        // 线性时间复杂度和空间复杂度 不能用Arrays.sort
        public int maximumGap(int[] nums) {
            if (nums.length < 2) return 0;
            int len = nums.length;
    
            // 找出最大值和最小值 为了方便后面确定桶的数量
            int max = -1, min = Integer.MAX_VALUE;
            for (int i  = 0; i < len; i++) {
                max = Math.max(nums[i], max);
                min = Math.min(nums[i], min);
            }
    
            // 排除nums全部为一样的数字,nums = [1,1,1,1,1,1];
            if (max - min == 0) return 0;
            // 用于存放每个桶的最大值
            int[] bucketMin = new int[len - 1];
            // 用于存放每个桶的最小值
            int[] bucketMax = new int[len - 1];
            Arrays.fill(bucketMax, -1);
            Arrays.fill(bucketMin, Integer.MAX_VALUE);
    
            // 确定桶的间距
            int interval = (int)Math.ceil((double)(max - min) / (len - 1));
            for (int i = 0; i < len; i++) {
                // 找到每一个值所对应桶的索引
                int index = (nums[i] - min) / interval;
                if (nums[i] == min || nums[i] == max) continue;
                // 更新每个桶的数据
                bucketMax[index] = Math.max(bucketMax[index], nums[i]);
                bucketMin[index] = Math.min(bucketMin[index], nums[i]);
            }
    
            // maxGap 表示桶之间最大的差距
            int maxGap = 0;
            // preMax 表示前一个桶的最大值
            int preMax = min;
            for (int i = 0; i < len - 1; i++) {
                // 表示某一个桶为空
                // 但凡某一个桶不为空,都会在前面的数据中更新掉bucketMax的值
                if (bucketMax[i] == -1) continue;
                maxGap = Math.max(bucketMin[i] - preMax, maxGap);
                preMax = bucketMax[i];
            }
            // [1,10000000]
            maxGap = Math.max(maxGap, max - preMax);
            return maxGap;
    
    
    
        }
    }
    作者:你的雷哥
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    【Thinking in Java, 4e】初始化与清理
    【Thinking in Java, 4e】控制流程执行
    【Beginning Python】抽象(未完)
    【Python】装饰器 & 偏函数
    【c++ primer, 5e】函数声明 & 分离式编译
    【Python】闭包 & 匿名函数
    【c++ primer, 5e】【函数基础】
    【Python】高阶函数
    变相的取消Datagridview控件的选中状态
    NotifyICon控件使用
  • 原文地址:https://www.cnblogs.com/henuliulei/p/15351475.html
Copyright © 2020-2023  润新知