164. 最大间距

Posted 不吐西瓜籽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了164. 最大间距相关的知识,希望对你有一定的参考价值。

算法记录

LeetCode 题目:

  给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。如果数组元素个数小于 2,则返回 0。



说明

一、题目

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

二、分析

  • 线性时间内解决,基数排序恰好满足。
  • 数据最大规模刚好在 32 方内,也就是空间上也可以支持。
  • 高十六低十六分别进行排序即可完成数组排序,之后再遍历查找相邻最大差值。
class Solution {
    private Integer divisor = 65536;
    public int maximumGap(int[] nums) {
        if(nums == null || nums.length < 2) return 0;
        int ans = 0;
        int[] middle = new int[divisor];
        int[] temp = new int[nums.length];
        for(int i = 0; i < nums.length; i++)
            middle[nums[i] % divisor] ++;
        for(int i = 1; i < middle.length; i++)
            middle[i] += middle[i - 1];
        for(int i = temp.length - 1; i >= 0; i--)
            temp[--middle[nums[i] % divisor]] = nums[i];
        
        for(int i = 0; i < divisor; i++)
            middle[i] = 0;
        
        for(int i = 0; i < temp.length; i++)
            middle[temp[i] / divisor] ++;
        for(int i = 1; i < middle.length; i++)
            middle[i] += middle[i - 1];
        for(int i = nums.length - 1; i >= 0; i--)
            nums[--middle[temp[i] / divisor]] = temp[i];
        for(int i = 1; i < nums.length; i++) {
            ans = Math.max(ans, nums[i] - nums[i - 1]);
        }
        return ans;
    }
}

总结

熟悉基数排序的规则和实现方法。

以上是关于164. 最大间距的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第164题—最大间距—Python实现

164. 最大间距

164. 最大间距

164 Maximum Gap 最大间距

Leetcode No.164 最大间距(桶排序)

Leetcode No.164 最大间距(桶排序)