牛客网刷题笔记--左右最值最大差

数组最大差值问题解析
本文解析了一个关于数组划分的问题,旨在寻找数组左右两部分最大值之差的绝对值最大情况。通过对不同划分情况的讨论,得出了解决该问题的有效算法。

题目要求:

给定一个长度为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
刚开始做这个题,看题目中“左部分中的最大值减去右部分最大值的绝对值,最大是多少”,我刚开始理解成了“左部分中的最大值,减去,右部分最大值的绝对值,最大是多少”,写出了程序,有测试用例没有通过,看结果显示,我理解错了!!原意应理解为“左部分中的最大值减去右部分,差的绝对值最大是多少”。天哪,语文功底好弱。。还是要多刷题。
对于理解正确了语义之后,开始分析,若要求差值最大值,那减数必须足够大,那第一步就先找到数组中的最大值,最大值可能在中间,也可能在两边。先对在两边的进行分析,如果在最左边,那么若想得到差值最大,那它的右侧值中的最大值必须足够小。而右侧的最大值与最右端数的大小有关。举例来说,将最大值右边的数字想像成山峰,想在群峰中找到最高山峰,那就看最右端的山峰,若最右端的山峰高于它周边的山峰,那没办法了,怎么分,都只能选它了,当它比周围山峰低时,那好啊,就选它,所以不管高还是低,只和最右侧的山峰有关;同理,如果最大值在右侧,只和最左端数字有关;那如果最大值在中间,那就先比较左右端,选取较小者呗。
其实这到题的编码很容易很容易,关键在能不能分析出这个规律。分析出了这个规律,就能感觉这道题就是个坑,坑,坑。。。
再次抱歉我的语文表达能力不是很好,但我会继续努力,继续写东西,不断提高。
最后,贴出代码以供后续查阅:
class MaxGap {
public:
    int findMaxGap(vector<int> A, int n) {
        // write code here
        if (A.empty() || n < 0) return 0;
        int max = 0, loc = 0, ans = 0;
        for (int i = 0; i < n; ++i) {
            if (A[i] > max) {
                max = A[i];
                loc = i;
            }
        }
        if (loc == n - 1)
            ans = abs(max - A[0]);
        if (loc == 0)
            ans = abs(max - A[n - 1]);
        if (loc > 0 && loc < n - 1) {
            if (A[0] < A[n - 1])
                ans = abs(max - A[0]);
            else
                ans = abs(max - A[n - 1]);
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值