给定正整数数组 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
第一种思路:
双重循环暴力解,会超时,需要优化到O(N)。
第二种思路:
已知需要求(A[i] + A[j] + i - j
)的最大值,那么对于每一个固定A【j】来说,能使上式得到最大值结果的sumA= A【i】+i 也必定是最大的sumA。
线性扫描一趟A, 用mmax和mmax_index记录下能使得当前sumA = A【i】 + i 达到最大值的A【i】和 i。
然后每次循环更新res即可。
class Solution(object):
def maxScoreSightseeingPair(self, A):
"""
:type A: List[int]
:rtype: int
"""
res = 0
mmax = A[0]
mmax_index = 0
for j in range(1, len(A)):
res = max(res, mmax + A[j] + mmax_index - j)
if A[j] + j > mmax + mmax_index:
mmax = A[j]
mmax_index = j
return res