您的位置:首页 > 编程语言

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

2016-06-15 15:11 232 查看
题目要求:

给定一个长度为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;

    }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程