11. 观光景点的得分问题

40 阅读1分钟
  1. 小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();