[小米面试题]一个乱序数组a[0...n-1],求a[j]-a[i]的最大值

小米面试题

一个乱序数组a[0…n-1],求a[j]-a[i]的最大值,其中i

一、观察现象

观察一个数组 int a[] = {5,19,40,2,100,844,12,3,6,8,33,90};
很明显最大差值应该是844-2=842
我们把数组分为前后两部分,分割位置为元素2的后面
数组分为两个子数组:
int a1[] = {5,19,40,2};
int a2[] = {100,844,12,3,6,8,33,90};
2刚好是a1的最小值,844是a2的最大值。

二、解决办法

我们通过一个k值,从头到尾多次分割数组。
分别求出每个k值对应的两个子数组a1的最小值a1_min,a2的最大值a2_max
最大差值就是a2_max-a1_min的最大值
可以通过反证法证明:
就是说 最大差值的时候,
a[i] 一定是前面半段数组的最小值,如果不是最小值,就应该去用那个最小值了。
a[j]一定是后面半部分的最大值,如果不是最大值,就应该去用那个最大值了
所以结果一定出现在当从某个k的下标分割时,后面的最大值减去前面的最小值。

//一个乱序数组a[0...n-1],求a[j]-a[i]的最大值,其中i
using namespace std;

class Solution {
public:
    int GetMax(int array[], int len) {
        int max = array[0];
        for (int i = 1; i < len; ++i) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        return max;
    }

    int GetMin(int array[], int len) {
        int min = array[0];
        for (int i = 1; i < len; ++i) {
            if (array[i] < min) {
                min = array[i];
            }
        }
        return min;
    }

    int GetMaxDiff(int array[], int len) {
        int maxDiff = array[1] - array[0];
        for (int i = 1; i < len; ++i) {
            int min = GetMin(array, i);
            int max = GetMax(array + i, len - i);
            if (maxDiff < (max - min)) {
                maxDiff = max - min;
            }
        }
        return maxDiff;
    }
};

int main()
{
    Solution s;
    int array[] = {0,1,40,2,100,844,12,3,6,8,33,8};
    cout << s.GetMaxDiff(array, sizeof(array)/ sizeof(int));
    return 0;
}

你可能感兴趣的:(c++,c++算法)