- 问题描述
给定一个无序整型数组,求将其排好序后,相邻两个数之间的最大差值。 - 解决方案
方法一
暴力方法,先排序后遍历
时间复杂度分析:和排序算法的时间复杂度相同,最快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;
}