列表

详情


OR25. 左右最值最大差

描述

给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0..K],右部分A[K+1..N-1],K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少?

给定整数数组A和数组的大小n,请返回题目所求的答案。

测试样例:
[2,7,3,1,1],5
返回:6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 360KB, 提交时间: 2021-06-19

class MaxGap {
public:
    int findMaxGap(vector<int> A, int n) {
        stack<int> s1, s2;
        for(int i = n - 1; i > 0; i--){
            s1.push(A[i]);
            if(s2.empty())
                s2.push(A[i]);
            else if(A[i] >= s2.top())
                s2.push(A[i]);
        }
        int m = A[0], ret = abs(A[0] - s2.top());
        for(int i = 0; i < n - 1; i++){
            m = max(m, A[i]);
            ret = max(ret, abs(m - s2.top()));
            if(s1.top() == s2.top())
                s2.pop();
            s1.pop();
        }
        return ret;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 428KB, 提交时间: 2021-08-12

class MaxGap {
public:
    int findMaxGap(vector<int> A, int n) {
        // write code here
        int maxa=A[0];
        int maxb=INT_MIN;
        int res=0;
        for(int i=0;i<A.size()-1;i++){
            maxa=max(maxa,A[i]);
            for(int j=i+1;j<A.size();j++){
                if(A[j]>maxb)
                    maxb=A[j];
            }
            res=max(res,abs(maxa-maxb));
            maxb=INT_MIN;
        }
        return res;
    }
};

上一题