力扣1014. 最佳观光组合(三种方法,逐步优化)

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值