给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。
一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们两者之间的距离。
返回一对观光景点能取得的最高分。
示例:
输入:[8,1,5,2,6]
输出:11
解释:i = 0, j = 2, A[i] + A[j] + i - j = 8 + 5 + 0 - 2 = 11
提示:
2 <= A.length <= 50000
1 <= A[i] <= 1000
解题思路
将A[i] + A[j] + i - j看成两部分,A[i]+i 和 A[j]-j 。要想使整体最大,只需使二者分别最大。由于有条件 i < j ,所以可以设定一个变量 A_pre_max 记录 A[j]-j 之前的 A[i]+i 的最大值。最后进行一次遍历即可。
class Solution(object):
def maxScoreSightseeingPair(self, A):
"""
:type A: List[int]
:rtype: int
"""
A_pre_max = A[0] + 0 # 记录前i个A[i] + i中的最大值
res = 0 # 返回的最大值
for i in range(1, len(A)):
res = max(A[i] - i + A_pre_max, res) # 判断能否更新最大值
A_pre_max = max(A_pre_max, A[i] + i) # 判断能否更新A[i] + i
return res