题解 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的主要内容,如果未能解决你的问题,请参考以下文章