自己思路是从:最大盛水的容器那个思路,到单调栈的思路,再到认识到我们只需要记录一个最好的点就可以了。
class Solution {
public:
int maxScoreSightseeingPair(vector<int>& A) {
int maxScore = 0;
int index = 0;
for (int i = 1; i < A.size(); ++i) {
maxScore = max(maxScore, A[i] + A[index] - (i - index));
if (A[index] - A[i] < i - index)
index = i;
}
return maxScore;
}
};
就是记录一个最好的点,每次迭代,如果它和当前值的差值大于它们位置之间的差值的话,那么就使用当前位置来替换。
另外还有一个更加骚的写法:
class Solution {
public:
int maxScoreSightseeingPair(vector<int>& A) {
int cur = 0, res = 0;
for (int num : A) {
res = max(res, num + cur);
cur = max(cur, num) - 1;
}
return res;
}
};
可以这样想:cur每过一个便流逝一个值,所以每次都减1。所以cur的意义是:之前最好的值流逝到这个位置还剩下的值。
确实不太好理解,还是我的好:)