LeetCodeQuestion1014.最佳观光组合

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

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

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

示例:

输入:[8,1,5,2,6]
输出:11
解释:i = 0, j = 2, A[i] + A[j] + i - j = 8 + 5 + 0 - 2 = 11

提示:

  1. 2 <= A.length <= 50000
  2. 1 <= A[i] <= 1000

思路一:

已知需要求的最大分数为max_grade = A[i] + A[j] + i - j
将其分块理解,A[i] + iA[j] - j (i < j)
当j确定时,A[j] - j是固定的值,此时只需要A[i] + i的值最大,max_grade也最大
max_grade的默认值为0,对j进行循环
用max函数找出在第j个元素前面所有的A[i] + A[j] + i - j的值的最大值,和初始的max_grade比较,并更新
果不其然,超时了

import numpy as np

class Solution(object):
    def maxScoreSightseeingPair(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        max_grade = 0
        for j in range(1,len(A)):
             max_grade = max(max_grade,max(list((np.array(A[:j])+np.array(list(range(j))))))+ A[j] - j)
        return max_grade

思路二:

大方向和思路一一样,当j确定时,A[j] - j是固定的值,此时只需要A[i] + i的值最大
max_grade的初始值为0,max_i (第j个元素前的最大的A[i] + i)=0
对j进行循环,每一次循环判断这两个值max_grademax_i是否需要更新
max_i的更新方式是控制时间的关键

class Solution(object):
    def maxScoreSightseeingPair(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        max_grade = 0
        max_i = A[0] + 0
        for j in range(1,len(A)):
            max_grade = max(max_grade,max_i + A[j] - j)
            max_i = max(max_i,A[j] + j)
        return max_grade

仅用于记录学习过程,如果有更好的方法欢迎相互交流讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值