题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/best-sightseeing-pairpython
给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,而且两个景点 i 和 j 之间的距离为 j - i。数组
一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们二者之间的距离。bash
返回一对观光景点能取得的最高分。微信
示例:spa
输入:[8,1,5,2,6] 输出:11 解释:i = 0, j = 2, A[i] + A[j] + i - j = 8 + 5 + 0 - 2 = 11
提示:code
咱们审题后发现,其实题目的答案已经在题目中有所体现。【一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们二者之间的距离】,在这里,咱们能够发现套用上面的公式,遍历比较求出最大便可。blog
那么咱们使用暴力解的时候,代码大体以下:索引
def maxScoreSightseeingPair(self, A: List[int]) -> int: length = len(A) max_score = 0 for i in range(length): for j in range(i+1, length): score = A[i] + A[j] + i - j if score > max_score: max_score = score return max_score
可是这里没法经过全部的用例(执行结果:超时)。leetcode
虽然执行以后会超时,可是,这个思路的方向是没有错的。咱们仔细看题目中所给的公式:rem
A[i] + A[j] + i - j, (i<j)
咱们将其转变为:
A[i] + i + A[j] - j, (i<j)
这样比较容易可以看出,能够将公式拆成两个部分 A[i] + i
和 A[j] - j
。
当对数组开始遍历时,对于 A[j]
来讲,这个值是固定的,A[j]
对应的索引 j
也是固定的。因此 A[j]-j
这个值也是固定的。
如今要求 A[i] + i + A[j] - j, (i<j)
,对于 A[j]
而言,要使得结果最大,也就是求 A[i]+i
取得最大值的时候。
最终在全部的 A[j]
中取得最大的那个结果返回。
具体的代码实现以下。
class Solution: def maxScoreSightseeingPair(self, A: List[int]) -> int: length = len(A) # 将公式转变为 A[i] + i + A[j] - j, (i<j) # 拆分为 A[i] + i,A[j] - j # A[i] + i 初始化为 A[0] + 0 max_value = A[0] + 0 ans = 0 for j in range(1, length): # 维护更新最大值 # 这里须要注意 i < j ans = max(ans, max_value + A[j] - j) # 这里维护更新 A[i] + i 的值,这里等同于与 A[i-1] + (i-1) 进行比较 # max_value 初始化为 A[0] + 0,此时 i = j = 1 max_value = max(max_value, A[j] + j) return ans
A[i] + i + A[j] - j, (i<j)
,这里须要注意 i<j
;A[j]
而言这里能够固定 A[j]-j
,那么公式求最大值,也便是求 A[i]+i
最大;A[j]
中挑选最大的结果返回。文章原创,若是以为写得好,欢迎点赞关注。微信公众号《书所集录》同步更新,一样欢迎关注点赞。