leetcode1014+最大的区间和,前缀后缀使用

https://leetcode.com/problems/best-sightseeing-pair/

//题目要求求出A[i] + A[j] + i - j最大值,这个表达式可以等价变为 (A[i] + i ) + (A[j] - j),
//对于A中每一个元素来说,都对应着两个值,分别是A[i]+i和A[i]-i。本题的解法可以抽象成把A分成两部分,
//第一部分找出使得A[i]+i能得到最大值的i,第二部分找出A[j]-j能得到最大值的j,两者之和就是最终的结果。

class Solution {
public:
    int maxScoreSightseeingPair(vector<int>& A) {
        int n = A.size();
        vector<int> maxA(n);
        maxA[0] = A[0] + 0;
        for(int i=1; i<n;i++){
            maxA[i] = max(maxA[i-1], A[i]+i);//maxA[i]为i之前最大的情况值了
        }
        int maxB = A[n-1]-(n-1);
        int ans = maxA[n-2]+maxB;
        for(int i=n-2;i>=1;i--){
            maxB = max(maxB, A[i]-i); //后缀最大值
            ans = max(ans, maxA[i-1]+maxB);//i-1前和i后的最大值 两最大值相加
        }
        return ans;
    }
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值