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

Qwen模型 LeetCode 2581. 统计可能的树根数目 Java实现

哇!这道2581题超有趣的,让我来给你讲讲我的解法~ 这道题就像是在玩侦探游戏,我们要找出所有可能的"树根"嫌疑人!

题目大意是:给我们一些从树中删除边的信息,让我们推断出哪些节点可能成为原来的树根。这就像是案发现场只留下了脚印,我们要还原整个故事。

```java
import java.util.*;

public class Solution {
public int rootCount(int[][] edges, int[][] guesses, int k) {
int n = edges.length + 1; // 节点数量

// 构建邻接表表示的树
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i < n; i++) {
graph.add(new ArrayList<>());
}

for (int[] edge : edges) {
graph.get(edge[0]).add(edge[1]);
graph.get(edge[1]).add(edge[0]);
}

// 将guesses转换为Set方便快速查找
Set<String> guessSet = new HashSet<>();
for (int[] guess : guesses) {
guessSet.add(guess[0] + "," + guess[1]);
}

// 第一次DFS:以0为根,计算初始猜对次数
int[] correctGuesses = {0};
boolean[] visited = new boolean[n];

dfs(0, -1, graph, guessSet, correctGuesses);

// 第二次DFS:换根DP
int[] result = {0};
reRootDfs(0, -1, graph, guessSet, correctGuesses[0], k, result);

return result[0];
}

// 第一次DFS:计算以0为根时猜对的次数
private void dfs(int node, int parent, List<List<Integer>> graph,
Set<String> guessSet, int[] correctGuesses) {
for (int child : graph.get(node)) {
if (child == parent) continue;

// 检查这条边是否被正确猜测
if (guessSet.contains(node + "," + child)) {
correctGuesses[0]++;
}

dfs(child, node, graph, guessSet, correctGuesses);
}
}

// 换根DFS
private void reRootDfs(int node, int parent, List<List<Integer>> graph,
Set<String> guessSet, int currentCorrect, int k, int[] result) {

// 如果当前根节点满足条件
if (currentCorrect >= k) {
result[0]++;
}

for (int child : graph.get(node)) {
if (child == parent) continue;

// 计算换根后的正确猜测数
int newCorrect = currentCorrect;

// 移除node->child这条边的影响
if (guessSet.contains(node + "," + child)) {
newCorrect--;
}
// 添加child->node这条边的影响
if (guessSet.contains(child + "," + node)) {
newCorrect++;
}

reRootDfs(child, node, graph, guessSet, newCorrect, k, result);
}
}
}
```

诶,你知道吗?这道题最精妙的地方在于"换根DP"的思想。就像是一棵树在旋转,每次把一个子节点变成新的根节点,我们只需要考虑边的方向变化带来的影响。

我来打个比方:想象你有一串圣诞灯,每个灯泡都可以当作电源插头。当我们把插头从一个灯泡换到另一个时,只需要关心它们之间那条线的电流方向变了没,其他线路都不用重新检查!

这个算法的时间复杂度是O(n),超级高效有没有?而且思路特别清晰:先固定一个根统计答案,然后通过遍历的方式"转动"这棵树,动态维护猜对的次数。

你最近是在准备面试吗?这种换根DP的题目在大厂面试中还挺常见的。要是想练更多类似的题目,我可以给你推荐几道经典的~要不要来个"树形DP特训"?😄

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

相关文章:

  • 8051单片机PDATA与XDATA存储访问优化解析
  • C#实现自动化创建Word可填写表单
  • AI依赖如何引发金融市场系统性风险:从认知退化到同质化共振
  • 高维因果推断:自动双机器学习(ADML)估计器原理与应用
  • 告别TeamViewer!在Ubuntu 22.04上安装向日葵远程控制的保姆级教程(附依赖问题解决)
  • Qwen模型 LeetCode 2584. 分割数组使乘积互质 Java实现
  • 别再死记硬背了!用Python+OpenCV手把手教你理解Anchor机制(附代码可视化)
  • Unity弓箭抛物线弹道实现:手动物理积分与实时预览
  • 差分隐私矩阵机制与FFT优化:保护多轮迭代计算的高效方法
  • C#根据时间加密和防止反编译的两种方案
  • 基于K-means与修正优化的数据压缩表示:为机器学习模型高效瘦身
  • 超效率SBM模型Python实战:用scipy.optimize处理含非期望产出的政府数据效率排名
  • 移动端3D高斯泼溅渲染优化:Lumina系统架构解析
  • 前端国际化进阶:日期时间格式化完全指南
  • 告别第三方工具!Windows 11自带SSH服务保姆级开启与开机自启教程
  • Qwen模型 LeetCode 2577. 在网格图中访问一个格子的最少时间 C语言实现
  • CSS Web安全字体
  • Godot 4地形性能修复:图层混合、LOD切换与法线生成三大断点解决方案
  • 前端国际化:复数规则与文案匹配深度解析
  • 别再死记硬背Sobel算子公式了!用Python+OpenCV手把手带你拆解卷积核的底层逻辑
  • 国内304不锈钢橱柜加工厂专业能力排行盘点:不锈钢钣金加工厂/专业不锈钢橱柜厂家/全屋定制不锈钢橱柜/定做不锈钢橱柜厂家/选择指南 - 优质品牌商家
  • Calico BGP故障诊断:从BIRD未就绪到Established的全链路排查
  • 前端国际化框架对比:i18next vs react-i18next vs Lingui vs Format.js
  • CVE-2024-38819漏洞复现:Tomcat 10.1.22 JNDI注入完整验证指南
  • 嵌入式开发中的字节序解析与C51实现方案
  • 从LightGBM到逻辑回归:手把手教你用category_encoders库搞定5种特征编码
  • AI同质化与认知依赖:金融系统性风险的新挑战与监管应对
  • 十年未更新的开源激光计算器LaserCalc,在2024年还能怎么用?我的实战踩坑与配置指南
  • Windows计划任务schtasks命令的‘隐藏’玩法与避坑指南:从权限设置到中文路径处理
  • 量子Jacobi-Davidson方法:电子结构计算的高效算法