1、题目描述:
2、题解:
方法1:暴力法
class Solution:
def maxScoreSightseeingPair(self, A: List[int]) -> int:
#暴力法,超时
res = 0
n = len(A)
for i in range(n-1):
for j in range(i+1,n):
temp = A[i] + A[j] + i - j
res = max(temp,res)
return res
方法二:
boss沿一轨道逃跑,每走一格停顿一次,主角沿路追杀,每一格上有个光环buff,站上去就增加A[j]的攻击力,
离开格子前,主角可以选择将该buff固定到自己身上(是否固定取决于身上buff与当前光环强度对比,
buff = max(buff, A[j]) ),固定后每走一格,效果减一(buff-=1)。每一格主角会以当前光环buff加成+
身上buff加成的总攻击力(A[j] + buff)攻击boss一次。问:整个追击过程中单次打出的最大伤害是多少?
(使用ans记录打出过的最大伤害,每攻击一次,刷新此变量)
class Solution:
def maxScoreSightseeingPair(self, A: List[int]) -> int:
buff = A[0] # 初始buff
ans = 0
for j in range(1, len(A)):
# 随着时间推移,buff的效力不断减少
# 初始效力为某个A[i], i < j
# 随时间减少的效力正好为 j - i
# 因此当前buff的剩余效力恰为 A[i] + i - j
buff -= 1
# 根据当前buff默默算一下自己的战斗力(战5渣..)
ans = max(ans, A[j] + buff)
# 看看当前buff剩余效力有没有刷新buff好,没有则刷新buff
buff = max(buff, A[j])
return ans
方法3:
我们把A[i] + A[j] + i - j分成A[i] + i + A[j] - j,用线性扫描,从前向后遍历,对于每一个j,A[j] - j是不变的,维护两个变量就行,max(A[i] + i )以及res,也就是max(A[i] + A[j] + i - j) = max(A[i] + i + A[j] - j) = max(A[i] + i ) + A[j] - j;对于每一个j,我们求出max(A[j]+j)就可以求出整个的最大值。
class Solution:
def maxScoreSightseeingPair(self, A: List[int]) -> int:
#枚举优化
res = 0
maxAi = A[0] + 0
for j in range(1,len(A)):
res = max(res,maxAi + A[j] - j)#维护总的
maxAi = max(maxAi,A[j] + j) #维护max(A[i] + i )
return res
3、复杂度分析:
方法一:
时间复杂度为O(N*N)
空间复杂度为O(1)
方法二和方法三:
时间复杂度为O(N)
空间复杂度为O(1)