164. Maximum Gap

16 篇文章 0 订阅
5 篇文章 0 订阅

Given an unsorted array, find the maximum difference between the successive elements in its sorted form.

Try to solve it in linear time/space.

Return 0 if the array contains less than 2 elements.

You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.

思路:bucket sort,n个数,n-1个间隔,建设所有数不是平均间隔的,如果以一边包括间隔边界,一边不包括来兼通

几个细节需要考虑:

细节1:interval和桶下标j的确定,每个数要落到哪个桶里

细节2:计算桶间距时,pre和max_interval的确定

//inner class
     class bucket{
         int max;
         int min;
        //constructor: public, no return type
        public bucket(){
            max=-1;
            min=-1;
        }
    }
    public int maximumGap(int[] nums) {
        int max=0, min=Integer.MAX_VALUE, n=nums.length;
        if(n<=1) return 0;
        for(int i=0; i<n; i++){
            max = Math.max(max, nums[i]);
            min = Math.min(min, nums[i]);
        }
        if(max==min) return 0;
        double interval = (double)(max-min)/(n-1);
        //need n buckets, why????
        bucket[] buckets = new bucket[n];
        //need to initialize each class array element
        for(int i=0; i<buckets.length; i++){
            buckets[i] = new bucket();
        }
        for(int i=0; i<n; i++){
            int j = (int)((nums[i]-min)/interval);
            buckets[j].max = buckets[j].max<0? nums[i]: Math.max(buckets[j].max, nums[i]);
            buckets[j].min = buckets[j].min<0? nums[i]: Math.min(buckets[j].min, nums[i]);
        }
        int max_interval = buckets[0].max - buckets[0].min;
        int pre =  buckets[0].max;
        for(int j=1; j<buckets.length; j++){
            if(buckets[j].max>=0){
                max_interval = Math.max(max_interval, buckets[j].min - pre);
                pre = buckets[j].max;
            }
        }
        return max_interval;
    }

public int maximumGap(int[] nums) {
        int max=0, min=Integer.MAX_VALUE, n=nums.length;
        if(n<=1) return 0;
        for(int i=0; i<n; i++){
            max = Math.max(max, nums[i]);
            min = Math.min(min, nums[i]);
        }
        int[][] bucket = new int[n][2];
        for(int i=0; i<n; i++){
            for(int j=0; j<2; j++){
                bucket[i][j]=-1;
            }
        }
        double interval = (double)(max-min)/(n-1);
        if(max==min) return 0;
        for(int i=0; i<n; i++){
            int j = (int)((nums[i]-min)/interval);
            bucket[j][0] = bucket[j][0]<0? nums[i]: Math.max(bucket[j][0], nums[i]);
            bucket[j][1] = bucket[j][1]<0? nums[i]: Math.min(bucket[j][1], nums[i]);
        }
        int max_interval = bucket[0][0] - bucket[0][1];
        int pre =  bucket[0][0];
        for(int j=1; j<bucket.length; j++){
            if(bucket[j][0]>=0){
                max_interval = Math.max(max_interval, bucket[j][1] - pre);
                pre = bucket[j][0];
            }
            
        }
        return max_interval;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值