Leetcode 3282. Reach End of Array With Max Score

1. 解题思路

这一题有一点脑筋急转弯的意思,核心就是想明白最优路径的构造方法。

显然,如果某一个点上的value比其后任意一个点都大,那么以这个点作为起点到终点所能获得的最大的score必然是从这个点直接跳到终点。

因此,我们将所有的点上的值从大到小进行排列,然后依次取出。

假设对于任意一个点 i i i,我们此时的目标位置为 j j j(初始 j j j即为 n − 1 n-1 n1),则有:

  1. 如果 i > = j i >= j i>=j,说明之前必然有一个更大的点在其左侧,因此我们只要先走到那个点上然后直接从那个点跳到其对应的目标点即可,其获得的score必然大于经过这个点的score。
  2. 如果 i < j i < j i<j,说明从 i i i j j j的这一段当中当前点必然是最大的点,因此我们只要先想办法走到当前点,然后直接跳到目标位置 j j j即可获得最大的score。此时,我们即刻更新新的目标位置为 i i i

由此反复迭代,我们即刻获得最优的路径。

2. 代码实现

给出python代码实现如下:

class Solution:
    def findMaximumScore(self, nums: List[int]) -> int:
        j = len(nums)-1
        nums = sorted([(x, i) for i, x in enumerate(nums)], key=lambda x: (-x[0], x[1]))
        score = 0
        for x, i in nums:
            if i >= j:
                continue
            score += (j-i) * x
            j = i
            if j == 0:
                break
        return score

提交代码评测得到:耗时2152ms,占用内存45.7MB。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值