给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。 如果数组元素个数小于 2,则返回 0。
示例 1:
输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2:
输入: [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。
说明:
你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。
代码:
class bucket{
int max=0;
int min=Integer.MAX_VALUE;
}
class Solution {
public int maximumGap(int[] nums) {
if(nums.length<=1)
return 0;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for(int i:nums){
max = Integer.max(max,i);
min = Integer.min(min,i);
}
int bucketSize = Integer.max(1,(max-min)/(nums.length-1));
bucket[] buckets = new bucket[(max-min)/bucketSize+1];
for(int i=0;i<nums.length;++i){
int index = (nums[i]-min)/bucketSize;
if(buckets[index]==null){
buckets[index] = new bucket();
}
buckets[index].min = Integer.min(nums[i],buckets[index].min);
buckets[index].max = Integer.max(nums[i],buckets[index].max);
}
int previousMax = Integer.MAX_VALUE;
int result = Integer.MIN_VALUE;
for(int i=0;i<buckets.length;++i){
if(buckets[i]!=null&&previousMax!=Integer.MAX_VALUE){
result = Integer.max(buckets[i].min-previousMax,result);
previousMax = buckets[i].max;
}
if(buckets[i]!=null){
result = Integer.max(buckets[i].max-buckets[i].min,result);
previousMax = buckets[i].max;
}
}
return result;
}
}