1. 解题思路
这一题有一点脑筋急转弯的意思,核心就是想明白最优路径的构造方法。
显然,如果某一个点上的value比其后任意一个点都大,那么以这个点作为起点到终点所能获得的最大的score必然是从这个点直接跳到终点。
因此,我们将所有的点上的值从大到小进行排列,然后依次取出。
假设对于任意一个点 i i i,我们此时的目标位置为 j j j(初始 j j j即为 n − 1 n-1 n−1),则有:
- 如果 i > = j i >= j i>=j,说明之前必然有一个更大的点在其左侧,因此我们只要先走到那个点上然后直接从那个点跳到其对应的目标点即可,其获得的score必然大于经过这个点的score。
- 如果 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。