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. 最大间距的主要内容,如果未能解决你的问题,请参考以下文章