码迷,mamicode.com
首页 > 编程语言 > 详细

算法——O(n)解决无序数组排序后的相邻最大差值

时间:2019-01-31 22:59:25      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:else   个数   bubuko   简单   分享图片   info   div   src   col   

题目从这儿看到的 : https://mp.weixin.qq.com/s/2OXg67MfBuQjDPAJxxD8rQ,但是公众号上有一点讲错了,问题还挺严重的。


 

题目:有一个无序数组2,3,1,4,6,排序后是1,2,3,4,6,最大差值是 6 - 4 = 2。

  1. 先找到数组的max和min。
  2. 创建一个长度为N+1的桶,第一个桶存储最小值,最后一个桶存储最大值。
  3. 除去第一个和最后一个,也就是N-2个数往N-1个桶里放,那么至少会有一个桶为空。
  4. 遍历新数组Array,计算每一个非空桶中的最小值,与下一个非空桶的最大值的差,数值最大的差即为原数组排序后的相邻最大差值。(所以,每个桶只需要记录当前桶的最大值、最小值即可)

  原公众号文章就是第四步错了:技术分享图片

举个简单的例子就知道是不对的了,最大值并不出现 在空桶的两侧。

技术分享图片

代码实现:

int find_Max_Offset(int *a,int length) {
    int min = getMin(a, length), max = getMax(a, length);
    if (max == min) return 0;
    int **bucket = new int*[length + 1];
    for (int i = 0; i < length + 1; i++) {
        bucket[i] = new int[3]; 
        bucket[i][0] = 0;
    }
    
    bucket[0][0] = 1;
    bucket[0][1] = bucket[0][2] = min;
    bucket[length][0] = 1;
    bucket[length][1] = bucket[length][2] = max;
    for (int i = 1; i < length; i++) {
        int index = ( a[i] - min) * length / (max - min);
        if (!bucket[index][0]) {
            bucket[index][0] = 1;
            bucket[index][1] = a[i];
            bucket[index][2] = a[i];
        }
        else {
            bucket[index][1] = a[i] > bucket[index][1] ? a[i] : bucket[index][1];
            bucket[index][2] = a[i] < bucket[index][2] ? a[i] : bucket[index][2];
        }
     }

    int offset = 0;
    for (int i = 0; i < length; i++) {
        int max = bucket[i++][1];
        while (bucket[i][0] == 0) i++;
        int min = bucket[i][2];
        offset = (min - max) > offset ? (min - max) : offset;
    }
    return offset;
}

 

算法——O(n)解决无序数组排序后的相邻最大差值

标签:else   个数   bubuko   简单   分享图片   info   div   src   col   

原文地址:https://www.cnblogs.com/czc1999/p/10344077.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!