当前位置: 首页 > news >正文

Kimi LeetCode 2836. 在传球游戏中最大化函数值 Java实现

这是 LeetCode 2836 的 Java 实现,核心思路是 倍增法(Binary Lifting)。

核心思路

1. 问题建模:`receiver` 构成一个出度为 1 的功能图(每个节点指向一个节点),要求从某个起点出发走 `k` 步,最大化路径上所有节点值之和(包含起点)。
2. 关键约束:`k` 最大可达 `10^10`,无法暴力模拟,必须用 倍增法 在 O(log k) 时间内跳跃。
3. 倍增预处理:
- `next[i][j]`:从节点 `i` 出发,走 `2^j` 步到达的节点
- `sum[i][j]`:从节点 `i` 出发,走 `2^j` 步经过的中间节点值之和(不含起点)
4. 转移方程:
- `next[i][j] = next[next[i][j-1]][j-1]`
- `sum[i][j] = sum[i][j-1] + sum[next[i][j-1]][j-1]`
5. 答案计算:对每个起点,将 `k` 拆分为二进制位,逐位跳跃累加。

Java 实现

```java
class Solution {
public long getMaxFunctionValue(List<Integer> receiver, long k) {
int n = receiver.size();
// k 的二进制位数,即倍增层数
int m = 64 - Long.numberOfLeadingZeros(k);

// next[i][j] = 从节点 i 出发走 2^j 步到达的节点
int[][] next = new int[n][m];
// sum[i][j] = 从节点 i 出发走 2^j 步,路径上所有中间节点值之和(不含起点 i)
long[][] sum = new long[n][m];

// 初始化:2^0 = 1 步
for (int i = 0; i < n; i++) {
next[i][0] = receiver.get(i);
sum[i][0] = receiver.get(i); // 走1步,只到达 receiver[i]
}

// 倍增预处理
for (int j = 1; j < m; j++) {
for (int i = 0; i < n; i++) {
int mid = next[i][j - 1];
next[i][j] = next[mid][j - 1];
sum[i][j] = sum[i][j - 1] + sum[mid][j - 1];
}
}

long ans = 0;

// 枚举每个起点
for (int start = 0; start < n; start++) {
int curr = start;
long total = start; // 包含起点自身的值

// 将 k 拆分为二进制,逐位跳跃
for (int j = 0; j < m; j++) {
if (((k >> j) & 1) == 1) {
total += sum[curr][j];
curr = next[curr][j];
}
}

ans = Math.max(ans, total);
}

return ans;
}
}
```

复杂度分析

指标 复杂度
时间 O(n × log k),预处理 O(n log k),枚举起点 O(n log k)
空间 O(n × log k),两个二维数组

示例说明

示例 1:`receiver = [2,0,1], k = 4`

- `k = 4 = 100₂`,需要 `m = 3` 层
- 从起点 `2` 出发:
- 初始 `total = 2`
- `k` 的第 2 位为 1:走 `2^2 = 4` 步
- `sum[2][2]` = 路径 `2→1→0→2→1` 的中间节点和 = `1+0+2+1 = 4`
- `total = 2 + 4 = 6`,最终到达节点 `1`
- 答案 `f(2) = 6` ✓

示例 2:`receiver = [1,1,1,2,3], k = 3`

- `k = 3 = 11₂`
- 从起点 `4` 出发:
- 初始 `total = 4`
- 第 0 位为 1:走 1 步,`sum[4][0] = 3`,`curr = 3`,`total = 7`
- 第 1 位为 1:走 2 步,`sum[3][1] = 2+1 = 3`,`curr = 1`,`total = 10`
- 答案 `f(4) = 10` ✓

关键点

- sum 的定义:`sum[i][j]` 存储的是走 `2^j` 步过程中经过的所有节点值之和(不含起点),这样最终答案就是 `起点值 + 各段 sum 之和`。

http://www.zskr.cn/news/1426696.html

相关文章:

  • 宁波酒店厨房设备回收:江北专业的空调回收公司选哪家 - LYL仔仔
  • 【独家首发】全球首份Claude竞品压力测试报告:在金融合同解析、医疗术语推理、多跳法律检索三大高危场景中,仅2家通过95%准确率阈值
  • 2026宁夏搬家公司推荐,甄选靠谱搬家服务商打造安心搬迁体验 - 品牌鉴赏师
  • 2026年GEO源头厂家公司怎么选?杭州本土技术派深度拆解 - 品牌报告
  • 系统性搜寻未知:构建可观测性驱动的技术问题排查框架
  • VideoGameBunny-V1-4B架构深度解析:BunnyPhi3与SigLIP视觉塔的技术融合
  • CANN/catlass A8W4量化TileCopy组件
  • 30天打造反臃肿AI演示工具:从减法设计到文件优先的工程实践
  • gte-base与其他嵌入模型对比:为什么选择阿里达摩院的文本嵌入方案
  • 【赵渝强老师】崖山数据库的数据字典
  • 照着用就行:2026年闭眼可入的专业降AI率平台 - 降AI小能手
  • AI建站避坑指南:10个高频问题帮你躲开90%的坑
  • HuggingFace镜像项目glaive_toolcall_zh:中文工具调用数据集贡献者完全指南
  • 天津本地商家GEO推广服务商推荐 - 舒雯文化
  • 别再只用RAID 0了!Ubuntu 22.04下用mdadm搭建RAID 0+1,兼顾速度与数据安全
  • Unity 2022 保姆级教程:从项目到APK,手把手教你打包第一个手机游戏
  • Fan Control终极指南:3步打造Windows风扇智能温控系统
  • 红队测试:攻击你的 Agent Harness 以发现漏洞
  • 山东滨亿机械设备:东营发电机出租公司推荐 - LYL仔仔
  • 金价992元/克!2026年5月珠海卖黄金,这6家门店实测排名出炉,第一名实至名归 - 润富黄金珠宝行
  • 如何快速掌握遗传数据分析:LDSC工具的完整指南
  • 从数据到决策:手把手教你用GEE分析TCC树冠数据,评估城市绿地与碳汇潜力
  • 2026最新舟山市黄金回收铂金回收白银回收怎么选?多家靠谱门店实测对比及联系方式推荐 - 亦辰小黄鸭
  • 别再傻傻用行波进位了!手把手教你用Verilog门级描述实现4bit超前进位加法器
  • 从自动关机到稳定运行:手把手教你排查并永久解决Windows Server 2016评估版激活问题
  • 下一代医疗分析系统:从数据融合、实时计算到临床落地的架构与实战
  • UniversalAdbDriver:Windows平台Android设备调试驱动统一解决方案
  • 告别昂贵硬件:用你的旧iPhone和UE5 Live Link搭建低成本虚拟制片演练环境
  • PPTX转HTML终极指南:免费快速实现PowerPoint到网页的无缝转换
  • 2026最新珠海市黄金回收铂金回收白银回收怎么选?多家靠谱门店实测对比及联系方式推荐 - 亦辰小黄鸭