相邻最大差值

来源:互联网 发布:雅思高频词汇 知乎 编辑:程序博客网 时间:2024/04/29 19:49
题目:

   请设计一个复杂度为O(n)的算法,计算一个未排序数组中排序后相邻元素的最大差值。

   给定一个整数数组A和数组的大小n,请返回最大差值。

代码:

   /*Designed by WYQ
*分析:

这是一个典型的利用桶排序求解问题,因为桶排序不少基于比较的排序可以打破nlogn的下限,

可以达到题目要求的复杂度n

* 相邻两个数差值最大 肯定大于平均值 平均值就是桶的长度 9,3,1,10

* 计算桶的长度

length = (max-min)/(n-1)

* count = (max-min)/length+1; count=3 即[1,4)[4,7)[7,10)[10,13)

*
* */
    public int findMaxDivision(int[] A, int n) {
         int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        int count = 0;
        int length = 0;
        
        for (int i = 0; i < n; i++) {
            min = min>A[i]?A[i]:min;
            max = max<A[i]?A[i]:max;
        }
        if (max==min){
            return 0;
        }else{
            length = (max-min)/(n-1);//计算桶的长度
            count = (max-min)/length+1;//计算桶的数目
        }
        int[] minbucket = new int[count];//存储每个桶的最小值
        for (int i = 0; i < count; i++) {
            minbucket[i] = Integer.MAX_VALUE;
        }
        int[] maxbucket = new int[count];//存储每个桶的最大值
        for (int i = 0; i < count; i++) {
            maxbucket[i] = Integer.MIN_VALUE;
        }
        boolean[] isempty = new boolean[count];//判断当前桶是否为空
        for (int i = 0; i < count; i++) {
            isempty[i] = true;
        }
        for (int i = 0; i <n; i++) {
            int j = getIndexBucket(min,max,A[i],length);//计算这个数应该位于那个桶
            isempty[j] = false;
            maxbucket[j]=A[i]>maxbucket[j]?A[i]:maxbucket[j];
            minbucket[j]=A[i]<minbucket[j]?A[i]:minbucket[j];
        }
        int lastmax = 0;//存储上一个桶的最大值
        boolean flag = true;
        int res = Integer.MIN_VALUE;//返回的最大差值
        for(int i=0;i<count;i++){
            if(flag&&!isempty[i]){
                lastmax = maxbucket[i];
                flag = false;
                continue;
            }
            if (!flag&&!isempty[i]){
                res = Math.max(res,minbucket[i]-lastmax);//当前桶的最小值与上一个桶的最大值比较 得到差值最大
                lastmax = maxbucket[i];//更换上一个桶的最大值
            }
        }
        return res;
    }
     /*
    * 计算这个数应该放到第几个桶*/
    public int getIndexBucket(int min,int max,int x,int length){
        return (x-min)/length;
    }


题目来源:http://www.nowcoder.com/practice/376ede61d9654bc09dd7d9fa9a4b0bcd?rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking

0 0
原创粉丝点击