LeetCode中最大间距


题目

  1. 最大间距
    给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。

如果数组元素个数小于 2,则返回 0。

示例 1:

输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。

示例 2:

输入: [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。

说明:

 - 你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
 - 请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。

题解:

方法一:
思路:先对数组进行排序,然后比较相邻数据的差值,找出最大的值即可返回

class Solution {
    public int maximumGap(int[] nums) {
        int res = 0;
        if(nums.length < 2 || nums == null){
            return 0;
        }
        // 对数组进行排序
        Arrays.sort(nums);
        // 遍历数组,比较相邻的数据之间的差值,找出最大值
        for(int i =1; i < nums.length; i++){
            res = Math.max(res, nums[i] - nums[i - 1]);
        }

        return res;
    }
}

方法二:桶排序
思路:因为题目要求在线性时间复杂度和空间复杂度解决问题,所以我们可以想到桶排序

class Solution {
    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];
        }
        maxGap = Math.max(maxGap, max - preMax);
        return maxGap;



    }
}

文章作者: Loole
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Loole !
评论
  目录