[leedcode 164] Maximum Gap

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.

public class Solution {
    public int maximumGap(int[] nums) {
       /* 桶排序
        假设有取值范围为A到B的N个元素,则他们的最大gap不会小于celling[(B - A) / (N - 1)]。
        让桶的长度len = celling[(B - A) / (N - 1)],则我们最多会有num = (B - A) / len + 1个桶(N)。
        对于数组中的任意元素K,我们可以通过计算toc = (K - A) / len轻松的找到它属于哪一个桶,然后我们维护每个桶中的最大值和最小值。
        由于同一个桶中元素的最大差值是len - 1,所有最后的答案不会是来自同一个桶中的两个元素。
        对于每一个非空的桶p,找到下一个非空的桶q,然后q.min - p.max就是该问题的潜在的最大值。返回这些值的最大值。*/
        if(nums==null||nums.length<=1) return 0;
        int min=nums[0];
        int max=nums[0];
        int len=nums.length;
        for(int i=1;i<len;i++){
            min=Math.min(min,nums[i]);
            max=Math.max(max,nums[i]);
        }
        int max_b[]=new int[len];
        int min_b[]=new int[len];
        for(int i=0;i<len;i++){
            int temp=nums[i];
            int k=(int)((len-1)*(1.0*(temp-min))/(max-min));
            if(min_b[k]==0||min_b[k]>temp) min_b[k]=temp;
            if(max_b[k]==0||max_b[k]<temp) max_b[k]=temp;
        }
        int res=0;
        int min1=max_b[0];
        for(int i=1;i<len;i++){
            if(max_b[i]==0) continue;
            res=Math.max(min_b[i]-min1,res);
            min1=max_b[i];
        }
        return res;
    }
}

 

posted @ 2015-08-02 12:30  ~每天进步一点点~  阅读(135)  评论(0编辑  收藏  举报