当前位置: 首页 > 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.jsqmd.com/news/915386/

相关文章:

  • CANN/catlass FP8转FP16反量化Tile操作
  • 从功能到价值:初创公司如何通过“卖结果”构建竞争壁垒
  • 宁波酒店厨房设备回收:江北专业的空调回收公司选哪家 - LYL仔仔
  • 【独家首发】全球首份Claude竞品压力测试报告:在金融合同解析、医疗术语推理、多跳法律检索三大高危场景中,仅2家通过95%准确率阈值
  • 2026年GEO源头厂家公司怎么选?杭州本土技术派深度拆解 - 品牌报告
  • 2026宁夏搬家公司推荐,甄选靠谱搬家服务商打造安心搬迁体验 - 品牌鉴赏师
  • 系统性搜寻未知:构建可观测性驱动的技术问题排查框架
  • XLMRoBERTa微调实战:huangjingwang/roberta-ner-multilingual模型训练全流程
  • Windows右键菜单管理终极指南:如何快速掌握ContextMenuManager
  • VideoGameBunny-V1-4B架构深度解析:BunnyPhi3与SigLIP视觉塔的技术融合
  • CANN/catlass A8W4量化TileCopy组件
  • 从状态机到运行时:聊聊 .NET 11 的 Runtime Async 和老 Async/Await 到底差在哪
  • 如何用ok-ww实现3倍效率提升:鸣潮自动化工具完全指南
  • 2026年珠海黄金回收行业大起底:6家门店横评,设备、报价、流程全拆解,第一名没悬念 - 润富黄金珠宝行
  • 义乌家家旺空调维修:义乌空调移机公司怎么联系 - LYL仔仔
  • 如何高效使用DownKyi:B站视频下载的终极解决方案
  • gte-base与其他嵌入模型对比:为什么选择阿里达摩院的文本嵌入方案
  • 30天打造反臃肿AI演示工具:从减法设计到文件优先的工程实践
  • Linux开发者的救星:用Remmina搞定公司Windows堡垒机远程连接(附文件互传保姆级教程)
  • 照着用就行:2026年闭眼可入的专业降AI率平台 - 降AI小能手
  • 【赵渝强老师】崖山数据库的数据字典
  • PoE Overlay终极指南:3个核心功能解决流放之路玩家最头疼的三大问题
  • AI建站避坑指南:10个高频问题帮你躲开90%的坑
  • 2026 年广州装修公司推荐与行业避坑解析 - 商业新知
  • 2026年大模型API路由网关技术观察:市面五个主流平台的客观横评
  • HuggingFace镜像项目glaive_toolcall_zh:中文工具调用数据集贡献者完全指南
  • 2026年成都公司注销代办手续究竟是怎样的流程? - 企业推荐官
  • ControlNet SDXL未来展望:MindSpore-Lab项目的技术路线图与发展方向
  • 华硕笔记本性能优化解决方案:G-Helper深度配置指南
  • 别再只用RAID 0了!Ubuntu 22.04下用mdadm搭建RAID 0+1,兼顾速度与数据安全