- 小R正在研究一组观光景点,每个景点都有一个评分,保存在数组
values中,其中values[i]表示第i个观光景点的评分。同时,景点之间的距离由它们的下标差j - i表示。一对景点(i < j)的观光组合得分为values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。求出最大组合得分。
function solution(values) {
// PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
// write code here
/* 暴力解法 双层循环*/
/* let max = -Infinity
// 循环外层的第一个景点
for (let i = 0; i < values.length; i++) {
// 第二个景点
for (let j = i + 1; j < values.length; j++) {
let score = values[i] + values[j] + i - j
// 更新最大得分
max = Math.max(max, score)
}
}
时间复杂度为: O(n^2)
空间复杂度为: O(1)
*/
/*
优化后的内容:
*/
let max = -Infinity
// 初始化第一个值
let max_prev = values[0] - 0
for (let i = 1; i < values.length; i++) {
// 用于记录 当前组合的最大分
let score1 = max_prev + values[i] - i
// 更新 最多得分
max = Math.max(max, score1)
// 更新 values[i] + i 的最大值
max_prev = Math.max(max_prev, values[i] + i)
}
return max; // Placeholder return
/*
时间复杂度:O(n)
只有一个 for循环进行更新最大值
空间复杂度: O(1)
*/
}
function main() {
console.log(solution([8, 3, 5, 5, 6]) === 11 ? 1 : 0);
console.log(solution([10, 4, 8, 7]) === 16 ? 1 : 0);
console.log(solution([1, 2, 3, 4, 5]) === 8 ? 1 : 0);
}
main();