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

Posted czc1999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法——O(n)解决无序数组排序后的相邻最大差值相关的知识,希望对你有一定的参考价值。

题目从这儿看到的 : 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)解决无序数组排序后的相邻最大差值的主要内容,如果未能解决你的问题,请参考以下文章

从无序序列中求这个序列排序后邻点间最大差值的O(n)算法

相邻最大差值

算法--相邻两数最大差值

排序练习题:相邻两数最大差值

第2章 排序 || 第20节 相邻两数最大差值练习题

给定一个数组,求如果排序后,相邻两个元素的最大差值,要求时间复杂度为O(N)