DAILY DOCDAILY DOC
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
  • Array

    • 数组
    • 二分查找
    • moveZeros
  • Dynamic-programming

    • 动态规划
  • 刷题指南
  • String

    • 字符串
  • bitwise-operator

    • 位运算符
  • heap
  • history

    • [1014] 最佳观光组合
    • [1022] 从根到叶的二进制数之和
    • [104] 二叉树的最大深度
    • [11] 盛最多水的容器
    • [110] 平衡二叉树
    • [1227] 飞机座位分配概率
    • [129] 求根节点到叶节点数字之和
    • [1306] 跳跃游戏 III
    • [148] 排序链表
    • 155.最小栈
    • [165] 比较版本号
    • 1763. 最长的美好子字符串
    • [1870] 准时到达的列车最小时速
    • [199] 二叉树的右视图
    • [21] 合并两个有序链表
    • 215.数组中的第 k 个最大元素
    • [2306] 公司命名
    • [234] 回文链表
    • [2516] 每种字符至少取 K 个
    • [316] 去除重复字母
    • [3171] 找到按位或最接近 K 的子数组
    • [322] 零钱兑换
    • [41] 缺失的第一个正数
    • [44] 通配符匹配
    • [494] 目标和
    • [509] 斐波那契数
    • [518] 零钱兑换 II
    • [62] 不同路径
    • [676] 实现一个魔法字典
    • 70 爬楼梯
    • [718] 最长重复子数组
    • [78] 子集
    • [82] 删除排序链表中的重复元素 II
    • [871] 最低加油次数
    • [88] 合并两个有序数组
    • [887] 鸡蛋掉落
    • 958.二叉树的完全性检验
    • [98] 验证二叉搜索树
    • [983] 最低票价
    • leetcode practice
    • 约瑟夫问题
    • 移除重复节点
  • linked-list

    • 706. 设计哈希映射
    • 链表
  • stack

    • stack
  • tree

    • Tree Traversal
    • 二叉树的最近公共祖先
    • 二叉树
    • 题目
  • leetCode 刷题
  • 回溯
  • 排序算法

[1014] 最佳观光组合

details

解题思路:

  1. 公式拆解: 我们可以将得分公式 A[i] + A[j] + i - j 进行拆分为:

    • A[i] + i(与位置 i 相关的部分)
    • A[j] - j(与位置 j 相关的部分)

    由于 j > i,即我们从左到右遍历数组,因此只需要记录之前景点的最大值 A[i] + i,并且在每一步都更新最佳观光组合的得分。

  2. 贪心算法: 我们遍历数组 A,在每一步中:

    • 计算当前景点 j 的组合得分 A[j] - j + max(A[i] + i)。
    • 记录当前的最大观光组合得分。
    • 更新 max(A[i] + i),以便在下一个景点计算时使用。

代码实现(JavaScript):

function maxScoreSightseeingPair(A) {
    let maxScore = 0; // 记录最佳观光组合的得分
    let maxAiPlusI = A[0]; // 记录 A[i] + i 的最大值

    // 遍历每个景点 j,从第 1 个景点开始
    for (let j = 1; j < A.length; j++) {
        // 当前观光组合得分为 A[i] + A[j] + i - j
        // 即 maxAiPlusI + A[j] - j
        maxScore = Math.max(maxScore, maxAiPlusI + A[j] - j);

        // 更新 max(A[i] + i) 的值
        maxAiPlusI = Math.max(maxAiPlusI, A[j] + j);
    }

    return maxScore;
}

// 示例
const A = [8, 1, 5, 2, 6];
console.log(maxScoreSightseeingPair(A)); // 输出 11

解释:

  • maxScore:保存最佳观光组合的最大得分。
  • maxAiPlusI:在遍历时保存 A[i] + i 的最大值。
  • 每一步通过 maxScore = Math.max(maxScore, maxAiPlusI + A[j] - j) 计算最佳组合分数。
  • maxAiPlusI = Math.max(maxAiPlusI, A[j] + j) 更新 A[i] + i 的最大值,供后续计算使用。

复杂度分析:

  • 时间复杂度:O(n),因为只需要遍历数组一次。
  • 空间复杂度:O(1),我们只用了常数空间。
Last Updated:
Contributors: rosendo
Next
[1022] 从根到叶的二进制数之和