题目描述
给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。
一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j)
:景点的评分之和减去它们两者之间的距离。
返回一对观光景点能取得的最高分。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-sightseeing-pair
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
算法思路
暴力
MAX=0
for i in range(len(A)):
for j in range(i+1,len(A)):
MAX= max(A[i]+A[j]+i-j,MAX)
return MAX
这个方法最简单,但是100%会被较大的数据量制裁
PERFECT
观光组合的得分为(A[i] + A[j] + i - j)
,可以变形成A[i]+i + A[j]-j
,且i<j
。
所以观光组合的得分就是这两部分的和。
遍历一遍数组,对每个A[j]-j
都有当前最大的A[i]+i
相加,然后更新最大观光组合分数。
然后再更新一下当前最大的A[i]+i
class Solution:
def maxScoreSightseeingPair(self, A: List[int]) -> int:
left, res = A[0], -1
for j in range(1, len(A)):
res = max(res, left + A[j] - j)
left = max(left, A[j] + j)
return res