news 2026/6/14 5:59:58

Kimi K2.6 思考 LeetCode 3241. 标记所有节点需要的时间 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi K2.6 思考 LeetCode 3241. 标记所有节点需要的时间 Java实现

LeetCode 3241. 标记所有节点需要的时间 — Java 实现

题目概述

给定一棵无向树,节点编号 `0` 到 `n-1`。每个节点 `i` 被标记的规则:
- 奇数节点:相邻节点在时刻 `x-1` 被标记,则 `i` 在时刻 `x` 被标记(耗时 1)
- 偶数节点:相邻节点在时刻 `x-2` 被标记,则 `i` 在时刻 `x` 被标记(耗时 2)

求以每个节点为起点时,标记所有节点所需的最长时间。

核心思路

将问题转化为树形 DP + 换根(Re-rooting):

1. 边权定义:从节点 `u` 到相邻节点 `v` 的"传播时间"取决于 `v` 的奇偶性
- `v` 为奇数:边权 = 1
- `v` 为偶数:边权 = 2

2. 两次 DFS:
- 第一次 DFS:计算每个节点子树内的最大深度和次大深度
- 第二次 DFS(换根):计算每个节点往父节点方向的最长路径,得到最终答案

Java 实现

```java
class Solution {
private int[] ans;
// node[x][0] = 子树 x 的最大深度 mx1
// node[x][1] = 子树 x 的次大深度 mx2
// node[x][2] = 最大深度要往哪个儿子 my 走
private int[][] node;

public int[] timeTaken(int[][] edges) {
int n = edges.length + 1;
List<Integer>[] g = new ArrayList[n];
Arrays.setAll(g, e -> new ArrayList<>());
for (int[] e : edges) {
int x = e[0], y = e[1];
g[x].add(y);
g[y].add(x);
}
ans = new int[n];
node = new int[n][3];
dfs(0, -1, g);
reroot(0, -1, 0, g);
return ans;
}

// 返回从 x 出发往子树方向的最大深度
private int dfs(int x, int fa, List<Integer>[] g) {
int mx1 = 0, mx2 = 0, my = 0;
for (int y : g[x]) {
if (y == fa) continue;
// 从 x 到 y 的边权: y 是偶数则 2, 奇数则 1
int depth = dfs(y, x, g) + 2 - y % 2;
if (mx1 < depth) {
mx2 = mx1;
mx1 = depth;
my = y;
} else if (mx2 < depth) {
mx2 = depth;
}
}
node[x][0] = mx1;
node[x][1] = mx2;
node[x][2] = my;
return mx1;
}

// from: 从 x 往父节点方向走的最长路径
private void reroot(int x, int fa, int from, List<Integer>[] g) {
ans[x] = Math.max(from, node[x][0]);
for (int y : g[x]) {
if (y != fa) {
// up1: 从 y 往上走到父节点 x 再继续往上
int up1 = from + 2 - x % 2;
// up2: 从 y 往上走到 x, 然后在 x 的其他子树中拐弯
int up2 = (y == node[x][2] ? node[x][1] : node[x][0]) + 2 - x % 2;
reroot(y, x, Math.max(up1, up2), g);
}
}
}
}
```

关键逻辑说明

变量 含义
`node[x][0]` 以 `x` 为根的子树中,往子树方向的最大深度
`node[x][1]` 以 `x` 为根的子树中,往子树方向的次大深度
`node[x][2]` 最大深度对应的子节点编号
`from` 从当前节点往父节点方向走的最长路径长度
`up1` 从子节点 `y` 往上经过 `x` 继续往上的路径
`up2` 从子节点 `y` 往上到 `x`,然后在 `x` 的其他子树中拐弯的路径

复杂度分析

- 时间复杂度:O(n),每个节点访问常数次
- 空间复杂度:O(n),递归栈和存储数组

示例验证

输入:`edges = [[0,1],[0,2]]`

- `i=0`:节点 1(奇数,耗时 1)→ `t=1`,节点 2(偶数,耗时 2)→ `t=2`,答案 = `2`
- `i=1`:节点 0(偶数,耗时 2)→ `t=2`,节点 2 需经过 0(偶数,耗时 2)→ `t=4`,答案 = `4`
- `i=2`:节点 0(偶数,耗时 2)→ `t=2`,节点 1(奇数,耗时 1)→ `t=3`,答案 = `3`

输出:`[2, 4, 3]` ✓

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 5:58:23

119.DDPM采样加速实战|DDIM低步数提速,20倍效率提升无损画质

摘要 扩散模型(Diffusion Models)是当前生成式AI领域最前沿的范式之一,在图像生成、音频合成、分子设计等领域展现出超越GAN和VAE的潜力。本文从数学原理出发,系统性地梳理扩散模型的前向加噪与反向去噪过程,提供一份经过验证的完整可运行PyTorch代码,并针对训练不稳定、…

作者头像 李华
网站建设 2026/6/14 5:56:30

NSK巅峰刚度重载滚珠丝杠DFD5008-6详解

型号 DFD 5008-6 属于 sources 中 NSK 的标准内循环式滚珠丝杠系列。 与您上一条查询的同尺寸 6 列大导程间隙品&#xff08;SFD 5008-6&#xff0c;静载 142,000 N&#xff0c;刚度 935 N/m&#xff09;相比&#xff0c;该型号是其对应的 D 预紧&#xff08;双螺母垫圈重度预紧…

作者头像 李华
网站建设 2026/6/14 5:49:29

四次多项式遗传比:面向工程设计的可解释形状生成协议

1. 项目概述&#xff1a;这不是数学竞赛题&#xff0c;而是设计工具箱里的新扳手“Two More Quartic Polynomial Genetic Ratios To Help Design Your Own!”——光看标题&#xff0c;你可能会以为这是某本冷门代数几何教材的附录小节&#xff0c;或者某个密码学会议上的晦涩摘…

作者头像 李华
网站建设 2026/6/14 5:48:14

从信创到云原生:一份超详细的SuperMap GIS项目硬件选型避坑指南

从信创到云原生&#xff1a;SuperMap GIS项目硬件选型实战指南当GIS项目经理第一次面对国产化替代需求时&#xff0c;紫光恒越服务器与华为TaiShan的性能差异究竟如何量化&#xff1f;三维城市建模项目中&#xff0c;RTX 3060显卡是否真的比专业级Quadro更经济高效&#xff1f;…

作者头像 李华
网站建设 2026/6/14 5:45:58

终极解码优化指南:如何在Kazumi上获得流畅的视频播放体验

终极解码优化指南&#xff1a;如何在Kazumi上获得流畅的视频播放体验 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP&#xff0c;支持流媒体在线观看&#xff0c;支持弹幕&#xff0c;支持实时超分辨率。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi 你…

作者头像 李华
网站建设 2026/6/14 5:44:49

Discord机器人定时任务实现详解

在现代的聊天平台中,Discord已经成为了许多社区的首选。作为一个Discord机器人开发者,你可能需要让你的机器人在特定时间执行特定的任务,同时在其他时间内正常处理用户的消息和命令。在本文中,我们将详细探讨如何使用Python和Discord API实现这一功能。 为什么需要定时任务…

作者头像 李华