牛客网刷题笔记--左右最值最大差
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;
}
};
给定一个长度为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;
}
};