0
点赞
收藏
分享

微信扫一扫

1014. Best Sightseeing Pair**

1014. Best Sightseeing Pair**

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

题目描述

Given an array ​​A​​​ of positive integers, ​​A[i]​​​ represents the value of the ​​i-th​​​ sightseeing spot, and two sightseeing spots ​​i​​​ and ​​j​​​ have distance ​​j - i​​ between them.

The score of a pair ​​(i < j)​​​ of sightseeing spots is (​​A[i] + A[j] + i - j​​) : the sum of the values of the sightseeing spots, minus the distance between them.

Return the maximum score of a pair of sightseeing spots.

Example 1:

Input: [8,1,5,2,6]
Output: 11
Explanation: i = 0, j = 2, A[i] + A[j] + i - j = 8 + 5 + 0 - 2 = 11

Note:

  • ​2 <= A.length <= 50000​
  • ​1 <= A[i] <= 1000​

C++ 实现 1

参考 ​​Detailed Explanation using DP [O(n) Time | O(1) Space]​​​, 求和分为两个部分 ​​(A[i] + i)​​​ 以及 ​​A[j] - j​​​. 使用 ​​res​​​ 来记录 ​​(A[i] + A[j] + i - j)​​​ 的最大值, 使用 ​​max_prev​​​ 来不断更新 ​​A[i] + i​​​ 的值. 由于 ​​max_prev​​​ 保存 ​​A[i] + i​​​ 的值, 因此更新 ​​res​​​ 时, 使用 ​​max_prev + A[j] - j​​.

class Solution {
public:
int maxScoreSightseeingPair(vector<int>& A) {
int res = 0, max_prev = 0;
for (int i = 0; i < A.size(); ++ i) {
res = std::max(res, max_prev + A[i] - i);
max_prev = std::max(max_prev, A[i] + i);
}
return res;
}
};

C++ 实现 2

思路和 ​​C++ 实现 1​​ 一致.

class Solution {
public:
int maxScoreSightseeingPair(vector<int>& A) {
int res = 0, max_prev = A[0] + 0;
for (int i = 1; i < A.size(); ++ i) {
max_prev = std::max(max_prev, A[i - 1] + i - 1);
res = std::max(res, max_prev + A[i] - i);
}
return res;
}
};

举报

相关推荐

0 条评论