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

小米面试题

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

一、观察现象

观察一个数组 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<j
#include <iostream>
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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容