zoukankan      html  css  js  c++  java
  • 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;
    
    
    
        }
    }
    作者:你的雷哥
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    金蝶K3 账套复制
    silverlight控件如何自适应
    一个使用Jquery写的一个鼠标拖动效果
    如何使用C#开发“类ActiveX组件”
    一个非科班出身程序员的成长历程
    Ubuntu 12.04下LAMP安装配置
    Abp vue项目找不到模块“./app.vue”
    google的分析(analytics)js代码分析以及重写
    javascript实现类似google和msn space的拖拽
    Lucene.Net, SQL Server 2008全文检索, Like模糊查询的一点心得
  • 原文地址:https://www.cnblogs.com/henuliulei/p/15351475.html
Copyright © 2011-2022 走看看