题解 LEETCODE1014

Posted TJJHAHA6

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 LEETCODE1014相关的知识,希望对你有一定的参考价值。

问题描述

给定正整数数组 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

思路

因为要求最高的得分 A[i] + A[j] + i - j , 最简单的思路是进行二重循环,每一个之间都进行运算,但是这样的话时间复杂度会达到O(n^2) ,无法通过样例。所以必须降低复杂度。

换个思路可以想想,求得max(A[i] + A[j] + i - j),可以拆成两部分:A[i] + i 和 A[j] - j 。而这样的话A[i] + i 对于每一项都是固定的,只要求得A[j] + j的最大值就可以保证整个最大,所以我们就可以将二重循环降为一重循环,先设定一个变量mx,它来记下当前点之前的A[i] + i的最大值,然后在循环中找到A[j] - j的最大值,相加即可找到答案。中间我们可以优化代码,比如mx可以在循环找(A[j] - j)中实时找A[i] + i的最大值。具体代码如下:

class Solution {
public:
   int maxScoreSightseeingPair(vector<int>& A) {
       int ans = 0, mx = A[0]+0;
       for(int i=1; i<A.size(); i++){
           ans = max(ans, mx+A[i]-i);
           mx = max(mx, A[i]+i);
      }
       return ans;
  }
};

最后

这个题可以说是纯智力题,我一开始是没想到的,因为本题难度是中等,所以我在写题就判断出二重循环无法实现,但是又没有具体思路,最后看了大佬的方法才恍然大悟,果然智商是硬伤,哈哈哈哈。

以上



以上是关于题解 LEETCODE1014的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-1014-最佳观光组合

Leetcode题解(24)

Leetcode题解(25)

[LeetCode]1014. 最佳观光组合

Leetcode 1014. 在 D 天内送达包裹的能力

LeetCode 1014. 最佳观光组合