/**
* 桶排序,如果每个桶的只有1个元素,无需桶内排序,时间复杂度O(n)
不过这题最需记录每个桶的最大,最小值,也不用桶内排序,所以复杂度O(n)
**/
public class Solution {
class Bucket{
boolean valid =false;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
}
public int maximumGap(int[] nums) {
if(nums == null || nums.length < 2) return 0;
int min = nums[0];
int max = nums[1];
/*算出最大最小值**/
for(int i=0;i<nums.length;i++){
min = Math.min(nums[i], min);
max = Math.max(nums[i], max);
}
/*确定桶的数目 = 数字个数**/
int num_buc = nums.length;
/*桶的间隔**/
int distance = (max - min) / num_buc + 1;
/*创建num_buc个桶**/
Bucket b_arr[] = new Bucket[num_buc];
for(int i=0;i<num_buc;i++)
b_arr[i] = new Bucket();
for(int i=0;i<nums.length;i++){
int n = (nums[i] - min) / distance ; //桶号(从0开始)
b_arr[n].valid = true;
b_arr[n].max = Math.max(b_arr[n].max, nums[i]);
b_arr[n].min = Math.min(b_arr[n].min, nums[i]);
}
/*后面一个有效桶的最小值 - 前面一个有效桶的最大值*/
int result = 0;
int pre_index = 0; //前一个桶的id,初始为第一桶。它不可能为空,因为最小值肯定在里面
for(int i=1;i<b_arr.length;i++){
if(b_arr[i].valid == false){ //该桶内无数据
continue;
}
result = Math.max(result,b_arr[i].min - b_arr[pre_index].max);
pre_index = i;
}
return result;
}
}
[LeetCode] 164. Maximum Gap
最新推荐文章于 2021-02-26 15:12:35 发布