牛客_左右最值最大差_C++题解

原题链接:牛客

题目缩写:给你一个数组,由你来进行一个切分,分为两份,每份至少有1个元素;你分出来的这两个区间中各自有一个最大值,两者之差再求绝对值就是答案,这个答案越大越好;

简要分析:

因为是(左区间的最大值-右区间最大值)再取绝对值,而我们整个数组的最大值总会被分到左或者右,即数组的最大值总会参与答案的计算,所以我们可以先遍历数组,求出那个最大值max(如下图中的7);

我们可以假设这个7被分到了左区间,我们的任务就是找右区间的最大值,然后相减再求绝对值,当然越大越好;

右边这个数组再小,它也有A[n-1]这个元素,我们以它为例来看:

①这个元素就是右边区间的最大值,直接选它 ;

②这个元素之前,max元素之后,也就是下图我标记的这个Q数组中有比它还大的值,我们此时可以把Q这个数组中的这几个元素给分到左区间里去,这不会影响左区间的老大,因为左区间的老大是整个数组的老大,而且此时右区间只剩下A[n-1]这个元素了,我们选它即可;

如果max被分到了右区间,我们同理可以得出,只要抓住了max这个值后,我们可以通过对区间的收缩来让A[0]成为我们要找的那个元素;

代码实现:

#include <climits>
class MaxGap 
{
public:
    int findMaxGap(vector<int> A, int n) 
    {
        int m = -INT_MAX;
        for(auto& e:A) m = max(m,e);
        int s = min(A[0],A[n-1]);
        return m-s;
    }
};

 参考链接:链接

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值