LeetCode 1014. 最佳观光组合
题目分析
这个题一开始我也没看懂怎么做,但是我知道暴力是可以解出来的,就尝试写了暴力写法,但是TLE了。
后来静下来仔细分析。我们在这个过程中需要寻找的是最大的两个值去进行比较。
我就依照这个思路做了第一版答案,发现这个思想是错的,因为两个最大值之间的距离可能非常的大,甚至不如它们之间的某个值与右手边的值得出来的答案大。
然后我就连续得了几个WA,心里拔凉拔凉的。
后来在判断上继续更新了下条件,就是加上了判断如果两个数值之差比距离之差还小的话,也要进行左边的浮标右移。得出的代码如下
代码
暴力法
/**
* LC 1014. 最佳观光组合。
* 解法一:暴力法,超时
* @param A
* @return
*/
public int maxScoreSightseeingPair1(int[] A) {
int max = 0;
for (int i = 0; i < A.length; i++) {
for (int j = i + 1; j < A.length; j++) {
if ((A[i] + A[j] + i - j) > max) {
max = A[i] + A[j] + i - j;
}
}
}
return max;
}
贪心思想
public int maxScoreSightseeingPair2(int[] A) {
int res = 0;
int temp = A[0];
int lastIndex = 0;
for (int i = 1; i < A.length; i++) {
res = Math.max(temp + A[i] + lastIndex - i, res);
if ((Math.abs(temp - A[i]) <= (i - lastIndex) || temp <= A[i])) {
temp = A[i];
lastIndex = i;
}
}
return res;
}
更加易懂的贪心思想
public int maxScoreSightseeingPair(int[] A) {
int res = 0;
int temp = A[0];
for (int i = 1; i < A.length; i++) {
res = Math.max(temp + A[i] - i, res);
//如果两个景点评分之差比距离之差还要小,就要将上一个选取的景点移动到当前景点上。
//同时遇到大于等于评分的景点也要往前移动,我们需要取得是最大值。
temp = Math.max(temp, A[i] + i);
}
return res;
}