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;
    }

posted @ 2020-11-26 14:39  CodeWangHAHA  阅读(68)  评论(0编辑  收藏  举报