无序数组排序后最大间隔

  • 问题描述
    给定一个无序整型数组,求将其排好序后,相邻两个数之间的最大差值。
  • 解决方案
方法一

暴力方法,先排序后遍历
时间复杂度分析:和排序算法的时间复杂度相同,最快O(NlogN)

 public static int maxGap2(int[] nums){
        if(nums == null || nums.length < 2)
            return 0;
        Arrays.sort(nums);
        int res = 0;
        for(int i = 1;i < nums.length;i ++){
            res = Math.max(res,nums[i] - nums[i - 1]);
        }
        return res;
    }
方法二

按照桶排序的思想,首先找到整个数组的最大值和最小值,然后将这个范围切分成(数组长度+1)份,每份对应一个桶,存储数组中每个元素落在该桶位置数的最大值和最小值,然后遍历桶数组每个非空桶最小值与前一个非空桶最大值的差值,找到最大的即为所求。
时间复杂度分析:O(N)级别,非常快

 public static int maxGap(int[] nums){
        if(nums == null || nums.length < 2)
            return 0;
        int res = 0;
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        int len = nums.length;
        for(int i = 0;i < len;i ++ ){
            max = Math.max(max,nums[i]);
            min = Math.min(min,nums[i]);
        }
        boolean[] hasValue = new boolean[len + 1];
        int[] maxs = new int[len + 1];
        int[] mins = new int[len + 1];
        int bucketIndex = 0;
        for(int i = 0;i < len;i ++ ){
            //注意整型相乘溢出问题
            bucketIndex = (int)((long)(nums[i] - min) * (long)len / (max - min));
            //System.out.println(bucketIndex);
            maxs[bucketIndex] = hasValue[bucketIndex] ? (Math.max(maxs[bucketIndex],nums[i])) : nums[i];
            mins[bucketIndex] = hasValue[bucketIndex] ? (Math.min(mins[bucketIndex],nums[i])) : nums[i];
            hasValue[bucketIndex] = true;
        }
        int last = maxs[0];
        for(int i = 1;i < len + 1;i ++){
            if(hasValue[i]){
                res = Math.max(res,mins[i] - last);
                last = maxs[i];
            }
        }
        return res;
    }
展开阅读全文
©️2020 CSDN 皮肤主题: 黑客帝国 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值