• LeetCode 1014. 最佳观光组合 | Python


    1014. 最佳观光组合


    题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/best-sightseeing-pair

    题目


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

    提示:

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

    解题思路


    我们审题后发现,其实题目的答案已经在题目中有所体现。【一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们两者之间的距离】,在这里,我们可以发现套用上面的公式,遍历比较求出最大即可。

    那么我们使用暴力解的时候,代码大致如下:

    def maxScoreSightseeingPair(self, A: List[int]) -> int:
        length = len(A)
        max_score = 0
        for i in range(length):
            for j in range(i+1, length):
                score = A[i] + A[j] + i - j
                if score > max_score:
                    max_score = score
        return max_score
    

    但是这里无法通过所有的用例(执行结果:超时)。

    虽然执行之后会超时,但是,这个思路的方向是没有错的。我们仔细看题目中所给的公式:

    A[i] + A[j] + i - j, (i<j)
    

    我们将其转变为:

    A[i] + i + A[j] - j, (i<j)
    

    这样比较容易能够看出,可以将公式拆成两个部分 A[i] + iA[j] - j

    当对数组开始遍历时,对于 A[j] 来说,这个值是固定的,A[j] 对应的索引 j 也是固定的。所以 A[j]-j 这个值也是固定的。

    现在要求 A[i] + i + A[j] - j, (i<j),对于 A[j] 而言,要使得结果最大,也就是求 A[i]+i 取得最大值的时候。

    最终在所有的 A[j] 中取得最大的那个结果返回。

    具体的代码实现如下。

    代码实现


    class Solution:
        def maxScoreSightseeingPair(self, A: List[int]) -> int:
            length = len(A)
            # 将公式转变为 A[i] + i + A[j] - j, (i<j)
            # 拆分为 A[i] + i,A[j] - j
            # A[i] + i 初始化为 A[0] + 0
            max_value = A[0] + 0
            ans = 0
            for j in range(1, length):
                # 维护更新最大值
                # 这里需要注意 i < j
                ans = max(ans, max_value + A[j] - j)
                # 这里维护更新 A[i] + i 的值,这里等同于与 A[i-1] + (i-1) 进行比较
                # max_value 初始化为 A[0] + 0,此时 i = j = 1
                max_value = max(max_value, A[j] + j)
    
            return ans
    

    实现结果


    实现结果

    总结


    • 根据题意,可以先使用暴力解尝试解决问题。这里虽然会超时,但可以确定方向是对的。
    • 将题目中所给的公式进行转换得到:A[i] + i + A[j] - j, (i<j),这里需要注意 i<j
    • 对于 A[j] 而言这里可以固定 A[j]-j,那么公式求最大值,也即是求 A[i]+i 最大;
    • 最终在所有的 A[j] 中挑选最大的结果返回。

    文章原创,如果觉得写得好,欢迎点赞关注。微信公众号《书所集录》同步更新,同样欢迎关注点赞。

  • 相关阅读:
    xadmin修改list_export_fields不生效以及添加exclude_export_fields功能
    Python正则总结
    Ubuntu安装Gitlab简记
    pytest使用总结笔记
    unittest使用数据驱动ddt
    unittest使用总结
    HTTP知识点总结
    HTTPS加密流程理解
    Requests库使用总结
    leetcode 76:最小字符串
  • 原文地址:https://www.cnblogs.com/yiluolion/p/13153942.html
Copyright © 2020-2023  润新知