每日一题,防止痴呆 = =
一、题目大意
给定正整数数组 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
二、题目思路以及AC代码
思路
这题首先想到如果进行暴力的话,复杂度是O(n^2),对于n=50000的数据来说是肯定会超时的。那么我们可以对暴力的方法进行优化,即将计算分数的公式换一种写法,score = A[i] + i + A[j] - j,这样的话,我们在遍历第j个景点的时候,只需要找到在 j 之前的景点中 A[i] + i 最大的就可以了,而 A[i] + i 最大,我们可以通过前缀数组或者一个变量来进行计算,从而在O(1)的时间复杂度内获得,总体上就是对景点 j 进行遍历,也就是O(n)的时间复杂度。
AC代码
#define MAX_INT 2147483647
class Solution {
public:
int maxScoreSightseeingPair(vector<int>& A) {
int n_size = A.size();
int pre = A[0];
int max_val = -MAX_INT;
for (int i=1;i<n_size;i++) {
int res = A[i] - i + pre;
if (res > max_val) max_val = res;
if (A[i] + i > pre) pre = A[i] + i;
}
return max_val;
}
};
如果有问题,欢迎大家指正!!!