【力扣】1014:最佳观光组合

题目描述

给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。

一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们两者之间的距离。

返回一对观光景点能取得的最高分。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-sightseeing-pair
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

算法思路

暴力

        MAX=0
        for i in range(len(A)):
            for j in range(i+1,len(A)):
                MAX= max(A[i]+A[j]+i-j,MAX)
        return MAX  

这个方法最简单,但是100%会被较大的数据量制裁

PERFECT

观光组合的得分为(A[i] + A[j] + i - j),可以变形成A[i]+i + A[j]-j,且i<j

所以观光组合的得分就是这两部分的和。
遍历一遍数组,对每个A[j]-j都有当前最大的A[i]+i相加,然后更新最大观光组合分数。
然后再更新一下当前最大的A[i]+i

class Solution:
    def maxScoreSightseeingPair(self, A: List[int]) -> int:
        left, res = A[0], -1
        for j in range(1, len(A)):
            res = max(res, left + A[j] - j)
            left = max(left, A[j] + j)
        return res
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章