[LeetCode] 1014. 最佳观光组合

61 阅读1分钟

1014. 最佳观光组合

Medium

思路

一开始的想法使用暴力法,双for然后计算出每一个景点和当前景点组成的景点对的评分,再求出最大值

但是如果能AC肯定不是Medium题,但是双for很快。花个半分钟试一下,不亏

TLE!

代码(TLE)

python3

class Solution:
    def maxScoreSightseeingPair(self, A: List[int]) -> int:
      r = 0
      for i in range(len(A)):
        for j in range(i+1, len(A)):
          r = max(r, A[i] + A[j] + i - j)
      return r

改进思路

和设想的一样,果不其然,TLE了。需要改进思路,再分析一下题意。

  • 题目要求max(A[i]+A[j]+i-j),其实就等价于max(A[i]+i+A[j]-j),等于max(A[i]+i) + max(A[j]-j)
  • 在遍历过程中,我们使用一个变量保存max(A[i]+i)
  • 如果单独在计算max(A[j]+j),又需要在遍历一次,又是O(n2)O(n^2)
  • 我们可以直接定义dp变量,dp表示当前到i位置最大的值,即dp = max(dp,dp+max(A[i]+i)
  • 使用滚动数组思想,将结果取最大值,每次遍历如果比当前的结果大,就更新结果

尝试写一下代码,AC!

代码

python3

class Solution:
    def maxScoreSightseeingPair(self, A: List[int]) -> int:
        dp = -1
        pre = A[0]
        for i in range(1,len(A)):
            dp = max(dp, A[i] - i + pre)
            pre = max(pre, A[i] + i)
        return dp