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

Kimi LeetCode 3373. 连接两棵树后最大目标节点数目 II Rust实现

以下是 LeetCode 3373. 连接两棵树后最大目标节点数目 II 的 Rust 实现。

解题思路

这道题的核心思路是:树是二分图。

- 对每棵树进行二分图染色(0/1),相邻节点颜色不同
- 颜色相同的节点之间距离为偶数,颜色不同的节点之间距离为奇数
- 节点 `u` 是节点 `v` 的 target 当且仅当路径边数为偶数(包括自身距离0)
- 对于 tree1 的节点 `i`,连接 tree2 后:
- tree1 内部能到达的 target 节点数 = 与 `i` 同色的节点数量
- tree2 中可以选择连接一个节点,使得 tree2 贡献的 target 节点数 = `max(tree2中颜色0的数量, tree2中颜色1的数量)`
- 因此 `answer[i] = cnt1[color1[i]] + max(cnt2[0], cnt2[1])`

Rust 代码

```rust
impl Solution {
pub fn max_target_nodes(edges1: Vec<Vec<i32>>, edges2: Vec<Vec<i32>>) -> Vec<i32> {
// 构建邻接表
fn build(edges: &Vec<Vec<i32>>) -> Vec<Vec<i32>> {
let n = edges.len() + 1;
let mut g = vec![vec![]; n];
for e in edges {
let a = e[0] as usize;
let b = e[1] as usize;
g[a].push(b as i32);
g[b].push(a as i32);
}
g
}

// DFS 二分图染色,同时统计每种颜色的节点数量
fn dfs(g: &Vec<Vec<i32>>, a: usize, fa: i32, c: &mut Vec<i32>, d: i32, cnt: &mut Vec<i32>) {
c[a] = d;
cnt[d as usize] += 1;
for &b in &g[a] {
if b != fa {
dfs(g, b as usize, a as i32, c, d ^ 1, cnt);
}
}
}

let g1 = build(&edges1);
let g2 = build(&edges2);
let n = g1.len();
let m = g2.len();

let mut c1 = vec![0; n]; // tree1 各节点的颜色
let mut c2 = vec![0; m]; // tree2 各节点的颜色
let mut cnt1 = vec![0; 2]; // tree1 两种颜色的计数
let mut cnt2 = vec![0; 2]; // tree2 两种颜色的计数

// 先处理 tree2,获取最优连接策略
dfs(&g2, 0, -1, &mut c2, 0, &mut cnt2);
// 再处理 tree1
dfs(&g1, 0, -1, &mut c1, 0, &mut cnt1);

// tree2 能贡献的最大 target 节点数
let t = cnt2[0].max(cnt2[1]);
let mut ans = vec![0; n];
for i in 0..n {
// tree1 中同色的节点数 + tree2 最优贡献
ans[i] = t + cnt1[c1[i] as usize];
}

ans
}
}
```

复杂度分析

- 时间复杂度: O(n + m),两次 DFS 遍历
- 空间复杂度: O(n + m),邻接表和辅助数组

代码下载

[LeetCode 3373 Rust 实现](sandbox:///mnt/agents/output/leetcode_3373_rust.rs)

http://www.jsqmd.com/news/1075556/

相关文章:

  • Neovim:十多万 Star 的编辑器,到底在改什么
  • 信创财务系统适配难?实测AI智能体,国产软硬件全栈落地避坑指南
  • 轻量级大模型边缘部署:Open Assistant工程实践指南
  • NXP Layerscape安全启动机制深度解析:从SRK表到错误码排错
  • 锋芒尽显|搭载AMD 6600H暴雨BJB200笔记本正式发布
  • IT AI建站:从丰田生产线到数字创作的新范式
  • 微信聊天记录永久保存方案:用WeChatMsg打造个人数字记忆库
  • 为什么同样卖秋冬服装,有人爆单有人库存积压?
  • 【Netty源码解读和权威指南】第49篇:Netty实战——开发高性能im即时通讯系统
  • (文末附skill资源)基于QClaw创建一个输入视频链接提取视频音频为文本的skill
  • 华硕笔记本性能调优神器:G-Helper全面解析与实用指南
  • DBeaver如何转储数据库(导出)
  • JMeter 2.6多线程压力测试实战指南:从脚本设计到结果分析
  • 一款Python语言Django框架DDD脚手架,适合快速搭建项目
  • 株洲零界传媒:专注GEO优化的AI品牌服务商
  • 上海AI智能体培训机构推荐:如何选择适合自己的AI学习平台
  • 构建能理解if/else条件逻辑的聊天机器人
  • 团队级AI协同操作系统:五层架构实现Claude Code规模化落地
  • 服装商城系统-python+Django
  • Cockpit:一个灵活的开源无头内容管理系统
  • Java 创建线程:继承 Thread 子类 vs 实现 Runnable 接口
  • Video2X技术架构深度解析:如何构建高性能视频超分辨率处理框架
  • Windows 11终极瘦身指南:3步免费清理系统臃肿
  • 2026美食视频背景音乐精选榜单:从国内首选到国际平台的差异化风格指南
  • LangFlow终极指南:三步构建智能AI应用的完整教程
  • 【共创季稿事节】鸿蒙原生 ArkTS 布局实战:Tabs + animateTo 实现页面切换过渡动画
  • 海量项目模版库实战应用与价值落地
  • MCP协议:AI工具调用的标准化插座与工程化落地指南
  • 国内如何稳定使用Gemini?七层协议适配与上下文保真实战指南
  • Windows 11终极优化指南:3步轻松移除系统臃肿,恢复电脑流畅体验