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

每日一题,防止痴呆 = =

一、题目大意

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值