class Solution {
public int maximumGap(int[] nums) {
if(nums.length <2) return 0;
else{
Arrays.sort(nums);
int array[] = new int[nums.length-1];
for(int i=0;i<nums.length-1;i++){
array[i] = nums[i+1] - nums[i];
}
Arrays.sort(array);
return array[array.length-1];
}
}
}
使用桶排序:思路是利用每个桶内的最大和相邻的非空桶的最小值最进行计算gap,得到最大的就可以,桶间隔设置为n-1就可以,再小一点也可以。
class Solution {
// 线性时间复杂度和空间复杂度 不能用Arrays.sort
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];
}
// [1,10000000]
maxGap = Math.max(maxGap, max - preMax);
return maxGap;
}
}
作者:你的雷哥
本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。