LeetCode 每日一题 最佳观光组合
最佳观光组合
给你一个正整数数组 values,其中 values[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的 距离 为 j - i。
一对景点(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 <= values.length <= 5 * 104
1 <= values[i] <= 1000
题解
这道题需要我们计算 values[i] + values[j] + i - j
关键是我们将 values[i] + i 与 values[j] -j 看成一起的
这样的话,values[i] + i 就是一个定值,我们在枚举 j 的时候,同时维护 values[i] + i 的最大值
我们就找到 values[i] + i 的最大值与 values[j] - j 的和的最大值就是需要的答案
最开始我的错误思路:
我是记录values[i] +i 的最大值与 values[j] +j 的最大值然后相加返回
错误点是:当两个的最大值同时取到的时候,不一定满足 i<j 这个条件
代码如下↓
int maxScoreSightseeingPair(int* values, int valuesSize) {
int res=0;
int m1=0,m2=0;
for(int i=0,j=1;j<valuesSize;j++,i++)
{
if(values[i]+i>m1)
{
m1=values[i]+i;
}
m2=values[j]-j;
if(m1+m2>res)
{
res=m1+m2;
printf("%d %d\n",m1,m2);
}
}
return res;
}