1014、最佳观光组合
给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。
一对景点(i < j)
组成的观光组合的得分为(A[i] + A[j] + i - j)
:景点的评分之和减去它们两者之间的距离。
返回一对观光景点能取得的最高分。
示例:
输入:[8,1,5,2,6]
输出:11
解释:i = 0, j = 2, A[i] + A[j] + i - j = 8 + 5 + 0 - 2 = 11
提示:
- $2 <= A.length <= 50000$
- $1 <= A[i] <= 1000$
题解
求最大的 A[i] + A[j] + i - j
1、巧妙枚举
暴力枚举的过程是:
int maxScore = 0;
for (int i = 1;i < A.length;i++) {
for (int j = 0;j < i;j++) {
maxScore = Math.max(A[i] + A[j] + i - j,maxScore);
}
}
return maxScore;
其实我们可以维护更新 max(A[i] + i),然后枚举每一个元素,更新最大值。
从而可以将复杂度从$O(n^2)$将至$O(n)$。
class Solution {
public int maxScoreSightseeingPair(int[] A) {
int max = A[0] + 0;
int maxScore = 0;
for (int i = 1;i < A.length;i++) {
maxScore = Math.max(max + A[i] - i, maxScore);
max = Math.max(A[i] + i, max);
}
return maxScore;
}
}
- 另一种实现,没有
i - j
public int maxScoreSightseeingPair(int[] A) {
int buff = A[0]; // 初始buff
int ans = 0;
for (int j = 1; j < A.length; j++) {
// 随着时间推移,buff的效力不断减少
// 初始效力为某个A[i], i < j
// 随时间减少的效力正好为 j - i
// 因此当前buff的剩余效力恰为 A[i] + i - j
buff--;
// 根据当前buff默默算一下自己的战斗力(战5渣..)
ans = Math.max(ans, A[j] + buff);
// 看看当前buff剩余效力有没有刷新buff好,没有则刷新buff
buff = Math.max(buff, A[j]);
}
return ans;
}
// 作者:dan-huang-jiang-xing-ren
// 链接:https://leetcode-cn.com/problems/best-sightseeing-pair/solution/lai-lai-lai-gei-zi-ji-jia-ge-buff-by-dan-huang-jia/
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com