LeetCode 2467 题解:树中最高盈利路径的正确 BFS 层序遍历实现

夜强君_6023

夜强君_6023

2026-09-02

166人浏览

原创

LeetCode 2467 题解:树中最高盈利路径的正确 BFS 层序遍历实现

本文详解 leetcode 2467「树中最高盈利路径」的算法逻辑,并重点指出 javascript 实现中因动态数组长度判断导致的层序遍历错误,提供修复方案与完整可运行代码。

本文详解 leetcode 2467「树中最高盈利路径」的算法逻辑,并重点指出 javascript 实现中因动态数组长度判断导致的层序遍历错误,提供修复方案与完整可运行代码。

LeetCode 2467 要求在无向树中模拟 Alice 从节点 0 出发、Bob 从给定节点 bob 出发同时向根节点 0 移动的过程,计算 Alice 沿任意根到叶路径所能获得的最大净收益。关键约束在于:若 Alice 与 Bob 同时到达同一节点,该节点金额减半;若 Bob 先到达(即更早抵达),Alice 到达时收益为 0;否则 Alice 获得全额金额。

算法分为两步:

  1. 预处理 Bob 的路径:通过 DFS 找出 Bob 从起点到根节点 0 的唯一路径,并记录每个节点在该路径中的到达步数(深度),存入哈希表 step;
  2. BFS 模拟 Alice 的所有可能路径:从节点 0 开始层序遍历,对每个扩展节点 neighbor,根据当前 depth + 1(Alice 到达该节点的步数)与 step[neighbor](Bob 到达该节点的步数)的关系,决定收益:
    • depth + 1 或 <code>neighbor 不在 Bob 路径中 → 全额 amount[neighbor];
    • depth + 1 === step[neighbor] → 半额 Math.floor(amount[neighbor] / 2);
    • depth + 1 > step[neighbor] → 收益为 0。

⚠️ 关键陷阱(导致 JS 版本失败的根本原因):
Python 原版使用 for _ in range(len(que)) 固定遍历当前层节点数,而原始 JS 代码写成:

for (let j = 0; j <p>由于 <code>queue.length</code> 在每次循环条件判断时<strong>动态更新</strong>(<code>shift()</code> 减少、<code>push()</code> 增加),导致内层循环实际遍历的节点数远超预期,破坏了层序结构——Alice 的“深度”<code>depth</code> 不再准确对应其所在层级,进而使 <code>depth + 1</code> 与 <code>step[neighbor]</code> 的比较失效,最终低估收益(如失败用例中输出 <code>16435</code>,期望 <code>17590</code>)。</p><p>✅ <strong>正确修复方式</strong>:在循环开始前缓存当前层节点数量:</p><pre class="brush:php;toolbar:false;">const levelSize = queue.length;
for (let j = 0; j <p>或使用倒序计数(更简洁):</p><pre class="brush:php;toolbar:false;">for (let j = queue.length; j > 0; j--) {
    let [cur, parent, profit] = queue.shift();
    // ...
}

以下是修复后的完整 JavaScript 解决方案(已通过全部测试用例,包括问题中提供的失败用例):

/**
 * @param {number[][]} edges
 * @param {number} bob
 * @param {number[]} amount
 * @return {number}
 */
var mostProfitablePath = function(edges, bob, amount) {
    const n = amount.length;
    const graph = Array.from({ length: n }, () => []);

    for (const [u, v] of edges) {
        graph[u].push(v);
        graph[v].push(u);
    }

    // DFS to find Bob's path to node 0
    let bobPath = null;
    const dfs = (node, parent, path) => {
        if (node === 0) {
            bobPath = [...path];
            return true;
        }
        for (const neighbor of graph[node]) {
            if (neighbor === parent) continue;
            path.push(neighbor);
            if (dfs(neighbor, node, path)) return true;
            path.pop();
        }
        return false;
    };
    dfs(bob, -1, [bob]);

    // Map: node -> Bob's arrival step
    const step = {};
    for (let i = 0; i  0) {
        const levelSize = queue.length; // ✅ Critical fix: freeze current level size
        for (let j = 0; j <p>? <strong>补充说明</strong>:</p>
  • Bob 的 DFS 必须保证找到唯一最短路径(树中两点间路径唯一),因此无需额外剪枝;
  • Alice 的 BFS 使用 graph[cur].length === 1 && cur !== 0 判断叶子节点是安全的(根节点 0 度数可能为 1,但非叶子);
  • 整数除法统一使用 Math.floor(x / 2),确保负数(如 -9152)也向下取整,符合题意(如 -9152 / 2 = -4576);
  • 时间复杂度:O(n),空间复杂度:O(n),满足大规模输入要求。

掌握层序遍历中“冻结队列长度”这一细节,是避免 BFS 类题目逻辑错误的关键。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

0

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

0

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

0

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

0

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

0

15

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

2026.10.22

20

12

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

2026.10.22

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习