letcode每日一题-最大间距
今日每日一题,最大间距,一看难度困难,我想ctrl+c再ctrl+v,但是再一看题,嗯,,,,我好想可以
我的代码:
public int maximumGap(int[] nums) {
Arrays.sort(nums);
int max=0;
for(int i=0;i<nums.length-1;i++){
int tmp=nums[i+1]-nums[i];
if(tmp>max){
max=tmp;
}
}
return max;
}
这道题的难点在于如何用线性的时空复杂度来解决。直接sort然后遍历数组当然可以解决问题,但是面试的时候这
种解法肯定是不能让面试官满意的。
实现代码如下:
public int maximumGap(int[] nums) {
if(nums.length==0){
return 0;
}
if(nums.length<=2){
return Math.abs(nums[0]-nums[nums.length-1]);
}
int max=Arrays.stream(nums).max().getAsInt();
int min=Arrays.stream(nums).min().getAsInt();
//Math.max防止出现长度为0的情况
int bucket_len=Math.max(1,(max-min)/(nums.length-1));
ArrayList<Integer>[] buckets=new ArrayList[(max-min)/bucket_len+1];
for(int i=0;i<nums.length;i++){
int tmpIndex=(nums[i]-min)/bucket_len;
if(buckets[tmpIndex]==null){
buckets[tmpIndex]=new ArrayList<>();
}
buckets[tmpIndex].add(nums[i]);
}
int result=0;
int prev=-1;
for(int i=0;i<buckets.length;i++){
if(buckets[i]!=null){
Collections.sort(buckets[i]);
if(prev!=-1){
int tmp=buckets[i].stream().min((a,b)->{if(a.equals(b)){return 0;} return a>b?1:-1;}).get()-prev;
if(tmp>result){
result=tmp;
}
}
prev=buckets[i].stream().max((a,b)->{if(a.equals(b)){return 0;} return a>b?1:-1;}).get();
}
}
return result;
}