【每日一题】LeetCode. 1014. 最佳观光组合

每日一题,防止痴呆 = =

一、题目大意

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

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

返回一对观光景点能取得的最高分。
【每日一题】LeetCode. 1014. 最佳观光组合_第1张图片
来源:力扣(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;
    }
};

如果有问题,欢迎大家指正!!!

你可能感兴趣的:(每日一题,leetcode,算法,动态规划,数学)