題目描述
給定正整數數組 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