题目
给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。
一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们两者之间的距离。
返回一对观光景点能取得的最高分。
链接:link.
分析
题目要求得到 ==A[i] + A[j] + i - j(i < j)==的最大值,首先暴力两重循环肯定可以解决。但是再进一步想一想,我们可以将式子分成两个部分 A[i] + i 和 A[j] - j,不难发现,对于每一个j景点,A[j] + j 是不变的,所以我们可以在一个循环里面同时更新最大的A[i] + i和最大结果值,这就是第二种解法。
题解
暴力求解
public static int maxScoreSightseeingPair(int[] A) {
int max = Integer.MIN_VALUE;
for (int i = 0; i < A.length; i++) {
for(int j=i+1 ; j<A.length ; j++){
if(A[i]+A[j]+i-j>max){
max = A[i]+A[j]+i-j;
}
}
}
return max;
}
枚举优化
public static int maxScoreSightseeingPair(int[] A) {
int len= A.length;
int max = Integer.MIN_VALUE, temp = A[0];
for (int i = 1; i < len; i++) {
// 同时更新两个值
max = Math.max(max, temp + A[i] - i);
temp = Math.max(temp, A[i] + i);
}
return max;
}
总结
第二种解法在一个循环里更新两个值还是比较难想到的,我想到了将式子分成两各部分分别用数组来存储,实际上没有什么优化,看到题解才想到可以这样做。