第一种方法:
找到每个下标元素右边第一个更大的元素的下标,这一步利用栈来实现。
第二种方法,拆分成
。
import sys
class Solution:
def maxScoreSightseeingPair(self, A: List[int]) -> int:
dic1 = {}
stack = []
for i, val in enumerate(A):
while stack and A[stack[-1]] < val:
j = stack.pop()
dic1[j] = i
stack.append(i)
for val in stack:
dic1[val] = -1
max_val = -sys.maxsize
for i in range(len(A) - 1):
j = i + 1
max_val = max(max_val, A[i] + A[j] - abs(i - j))
while dic1[j] != -1:
j = dic1[j]
max_val = max(max_val, A[i] + A[j] - abs(i - j))
return max_val
第二种方法:
把i和j分开考虑
class Solution {
public int maxScoreSightseeingPair(int[] A) {
int ans=0;
int mx=A[0];
for (int i = 1; i < A.length; i++) {
ans=Math.max(ans,mx+A[i]-i);
mx=Math.max(mx,A[i]+i);
}
return ans;
}
}