Leetcode.1014 最佳观光组合
题目链接
Leetcode.1014 最佳观光组合 Rating : 1730
题目描述
给你一个正整数数组 values
,其中 values[i]
表示第 i
个观光景点的评分,并且两个景点 i
和 j
之间的 距离 为 j - i
。
一对景点
(
i
<
j
)
(i < j)
(i<j)组成的观光组合的得分为 values[i] + values[j] + i - j
,也就是景点的评分之和 减去 它们两者之间的距离。
返回一对观光景点能取得的最高分。
示例 1:
输入:values = [8,1,5,2,6]
输出:11
解释:i = 0, j = 2, values[i] + values[j] + i - j = 8 + 5 + 0 - 2 = 11
示例 2:
输入:values = [1,2]
输出:2
提示:
- 2 < = v a l u e s . l e n g t h < = 5 ∗ 1 0 4 2 <= values.length <= 5 * 10^4 2<=values.length<=5∗104
- 1 < = v a l u e s [ i ] < = 1000 1 <= values[i] <= 1000 1<=values[i]<=1000
解法:动态规划
首先我们将这个式子 values[i] + values[j] + i - j
看成两部分 values[i] + i
和 values[j] - j
,我们就是要让这两部分加起来最大。
我们用 left
来表示 [0,j-1]
中最大的 values[i] + i
,那么原式转换为求 left + values[j] - j
的最大值,直接一次遍历即可。
时间复杂度: O ( n ) O(n) O(n)
C++代码:
class Solution {
public:
int maxScoreSightseeingPair(vector<int>& values) {
int ans = 0 , left = values[0];
int n = values.size();
for(int i = 1;i < n;i++){
ans = max(ans,left + values[i] - i);
left = max(left,values[i] + i);
}
return ans;
}
};
Python代码:
class Solution:
def maxScoreSightseeingPair(self, values: List[int]) -> int:
ans , left = 0 , values[0]
n = len(values)
for i in range(1,n):
ans = max(ans , left + values[i] - i)
left = max(left , values[i] + i)
return ans
相关文章
- Java实现 LeetCode 309 最佳买卖股票时机含冷冻期
- 2013年度最佳 jQuery 插件集合(1) - 前端编程 - IT工作生活这点事。Just Su
- 高德最佳实践:Serverless 规模化落地有哪些价值?
- SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可灰度)
- SQLServer · 最佳实践 · SQL Server 2012 使用OFFSET分页遇到的问题
- Atitit 拦截数据库异常的处理最佳实践
- atitit.人脸识别的应用场景and使用最佳实践 java .net php
- Atitit.列表页面and条件查询的实现最佳实践(2)------翻页 分页 控件的实现java .net php
- web 应用开发最佳实践之一:避免大型、复杂的布局和布局抖动
- Hudi自带工具DeltaStreamer的实时入湖最佳实践
- 诛仙手游-情缘高攻路线是低道法的最佳选择
- 操作系统OPT算法(最佳页面替换算法)