给定正整数数组 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
思路一:
已知需要求的最大分数为max_grade = A[i] + A[j] + i - j
将其分块理解,A[i] + i与A[j] - j (i < j)
当j确定时,A[j] - j是固定的值,此时只需要A[i] + i的值最大,max_grade也最大
设max_grade的默认值为0,对j进行循环
用max函数找出在第j个元素前面所有的A[i] + A[j] + i - j的值的最大值,和初始的max_grade比较,并更新
果不其然,超时了
import numpy as np
class Solution(object):
def maxScoreSightseeingPair(self, A):
"""
:type A: List[int]
:rtype: int
"""
max_grade = 0
for j in range(1,len(A)):
max_grade = max(max_grade,max(list((np.array(A[:j])+np.array(list(range(j))))))+ A[j] - j)
return max_grade
思路二:
大方向和思路一一样,当j确定时,A[j] - j是固定的值,此时只需要A[i] + i的值最大
设max_grade的初始值为0,max_i (第j个元素前的最大的A[i] + i)=0
对j进行循环,每一次循环判断这两个值max_grade和max_i是否需要更新
max_i的更新方式是控制时间的关键
class Solution(object):
def maxScoreSightseeingPair(self, A):
"""
:type A: List[int]
:rtype: int
"""
max_grade = 0
max_i = A[0] + 0
for j in range(1,len(A)):
max_grade = max(max_grade,max_i + A[j] - j)
max_i = max(max_i,A[j] + j)
return max_grade
仅用于记录学习过程,如果有更好的方法欢迎相互交流讨论!