计算一个未排序数组中排序后相邻元素的最大差值

题目描述

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

给定一个整数数组A和数组的大小n,请返回最大差值。保证数组元素个数大于等于2小于等于500。

测试样例:
[9,3,1,10],4
返回:6
class MaxDivision {
public:
 int findMaxDivision(vector<int> A, int n) {
        make_heap(A.begin(),A.end());
        sort_heap(A.begin(),A.end());
        int max = 0,tmp;
        for(int i=1;i<n;i++)
        {
            tmp = A[i]-A[i-1];
            max = tmp>max ? tmp:max;
        }
        return max;
    }
};

不明白上述方法为什么可以通过调试????

class MaxDivision {
public:
    int findMaxDivision(vector<int> A, int n) {
        // write code here
        set<int> s;
        set<int>::iterator iter;
        set<int>::iterator iter2;
        for(int i=0;i<n;i++)
            s.insert(A[i]);
        iter=s.begin();
        int max=0;
        int first=*iter;
        int second=*iter;
         
        for(iter=s.begin();iter!=s.end();++iter)
        {
            if(*iter>first)
            {
                second=*iter;
                if(second-first>max)
                {
                    max=second-first;
                }
                first=second;
            }           
        }
        return max;
 
    }
};
 
最适合的方法是桶排序:
1.找出最大值和最小值。
2.生成一个最大值-最小值的区间 比如最大值9,最小值3,那就需要7个桶 
3.往里面填
4.查找空桶,最多的即为最大差值。
public static int findMaxDivision(int[] A, int n) {
    int maxnum = A[0];
    int minnum = A[0];
    for (int i = 0; i < A.length; i++) {
        if (maxnum < A[i])
            maxnum = A[i];
        if (minnum > A[i])
            minnum = A[i];
    }
    int[] arr = new int[maxnum - minnum + 1]; // 生成桶
    for (int i = 0; i < A.length; i++) {
        arr[A[i] - minnum]++; // 填桶
    }
    int count = 0;
    int max = 0;
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == 0) { // 桶为空
            count++;   //记录连续空桶数
        } else {
            if (max < count)
                max = count;
            count = 0;
        }
    }
    return max+1;  //如最大值为9,最小值为3,中间有5个空桶,但差值应为6
}

  

https://www.nowcoder.com/questionTerminal/376ede61d9654bc09dd7d9fa9a4b0bcd

拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
原文地址:https://www.cnblogs.com/dd2hm/p/7259526.html