news 2026/5/17 8:12:25

DeepSeek LeetCode 2421. 好路径的数目 public int numberOfGoodPaths(int[] vals

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 2421. 好路径的数目 public int numberOfGoodPaths(int[] vals

这道题要求统计“好路径”的数量,定义是路径起点和终点的值相等,且路径上所有节点的值都 ≤ 这个值。

我来帮你梳理思路并给出可直接使用的代码。

---

思路分析

1. 关键条件理解
· 路径的起点值 vals[u] = 终点值 vals[v]。
· 路径上所有中间节点的值 ≤ 起点值(所以其实是 ≤ vals[u])。
· 因此,对于节点值相等的两个节点,如果它们之间的路径上所有节点值都 ≤ 这个值,则这条路径就是“好路径”。
2. 并查集 + 值从小到大处理
· 将所有节点按值升序排序。
· 每次处理一种值 v 的所有节点时,只考虑值 ≤ v 的边来连接(按值升序逐步加边)。
· 在加入值 v 的节点及其与值 ≤ v 节点的边后,使用并查集将连通块合并。
· 对于当前值 v,每个连通块内具有值 v 的节点数 cnt,它们两两之间的路径都是好路径(同值且值最大,路径上无更大值节点,因为更大的值还没加进来)。
· 对每个值 v,贡献为 C(cnt, 2) + cnt(每个节点自身也算一条长度为 0 的路径)。
3. 算法步骤
· 按值排序节点索引。
· 按值升序排序所有边(或边只按两端节点的较大值排序)。
· 顺序枚举每个值,对于当前所有值 ≤ 当前值的节点,利用并查集合并它们之间的边。
· 统计每个连通块中当前值节点个数,累加贡献。
4. 时间复杂度
· 并查集 + 排序节点 + 排序边:O(n log n + m log m),其中 m = edges.length。

---

代码实现

```java
import java.util.*;

class Solution {
public int numberOfGoodPaths(int[] vals, int[][] edges) {
int n = vals.length;
// 按节点值升序存储节点索引
List<Integer> nodes = new ArrayList<>();
for (int i = 0; i < n; i++) nodes.add(i);
nodes.sort(Comparator.comparingInt(a -> vals[a]));

// 建图:邻接表
List<Integer>[] graph = new List[n];
for (int i = 0; i < n; i++) graph[i] = new ArrayList<>();
for (int[] e : edges) {
int u = e[0], v = e[1];
graph[u].add(v);
graph[v].add(u);
}

// 并查集
int[] parent = new int[n];
int[] size = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
size[i] = 1;
}

// 按值升序处理节点
int ans = 0;
boolean[] active = new boolean[n];
for (int i = 0; i < n; ) {
int curVal = vals[nodes.get(i)];
// 收集所有值等于 curVal 的节点
List<Integer> curNodes = new ArrayList<>();
while (i < n && vals[nodes.get(i)] == curVal) {
curNodes.add(nodes.get(i));
i++;
}

// 将所有相邻的、值 <= curVal 的节点合并(即当前 active 的节点)
for (int u : curNodes) {
for (int v : graph[u]) {
if (active[v]) {
union(parent, size, u, v);
}
}
active[u] = true;
}

// 统计当前值 curVal 在同一个连通块中的数量
Map<Integer, Integer> cnt = new HashMap<>();
for (int u : curNodes) {
int root = find(parent, u);
cnt.put(root, cnt.getOrDefault(root, 0) + 1);
}

// 组合数 C(cnt,2) + cnt
for (int c : cnt.values()) {
ans += c * (c + 1) / 2;
}
}
return ans;
}

private int find(int[] parent, int x) {
if (parent[x] != x) {
parent[x] = find(parent, parent[x]);
}
return parent[x];
}

private void union(int[] parent, int[] size, int a, int b) {
int ra = find(parent, a);
int rb = find(parent, b);
if (ra == rb) return;
if (size[ra] < size[rb]) {
parent[ra] = rb;
size[rb] += size[ra];
} else {
parent[rb] = ra;
size[ra] += size[rb];
}
}
}
```

---

简要解释

· active 数组标记当前已经允许使用的节点(值 ≤ 当前处理的值)。
· 处理值 v 时,先把这些节点标记为 active,然后通过已激活的边将它们合并到同一个连通块。
· 统计每一个连通块中当前值 v 的节点数量,它们两两之间都是好路径。
· 加上自己到自己的路径(单节点路径)。㇏

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

LoRA模型合并实战指南:使用vLLM与CopaW融合多技能大语言模型

1. 项目概述&#xff1a;LoRA模型合并的“瑞士军刀”最近在折腾大语言模型微调的朋友&#xff0c;估计没少跟LoRA&#xff08;Low-Rank Adaptation&#xff09;打交道。这玩意儿确实好用&#xff0c;用少量显存和数据集就能让一个通用大模型学会新技能&#xff0c;比如写代码、…

作者头像 李华
网站建设 2026/5/17 8:09:55

基于LLM与RAG的智能笔记系统:用Smart2Brain构建你的第二大脑

1. 项目概述&#xff1a;当笔记遇上智能大脑 最近在折腾我的 Obsidian 知识库时&#xff0c;发现了一个挺有意思的插件项目&#xff1a;Smart2Brain。这名字起得挺直白&#xff0c;翻译过来就是“聪明到大脑”&#xff0c;核心目标是把你的 Obsidian 笔记库&#xff0c;从一个静…

作者头像 李华
网站建设 2026/5/17 8:08:55

本地化AI代码生成器DaVinci:低成本、高隐私的开发者利器

1. 项目概述&#xff1a;一个为开发者“省钱”的代码生成器最近在开源社区里闲逛&#xff0c;发现了一个挺有意思的项目&#xff0c;叫“DevMiser/DaVinci”。光看这个名字就挺有故事感的——“DevMiser”&#xff0c;开发者中的“吝啬鬼”&#xff0c;而“DaVinci”又让人联想…

作者头像 李华
网站建设 2026/5/17 8:08:49

Redis增强工具包:封装分布式锁、缓存模板与监控的最佳实践

1. 项目概述&#xff1a;一个Redis开发者的“瑞士军刀”在分布式系统和高并发场景下&#xff0c;Redis几乎成了标配。但用久了你会发现&#xff0c;官方客户端虽然稳定&#xff0c;但在日常开发、调试、运维中&#xff0c;总有些“不够顺手”的地方。比如&#xff0c;想批量按模…

作者头像 李华
网站建设 2026/5/17 8:07:49

终极指南:如何用Office Custom UI Editor轻松打造专属办公界面

终极指南&#xff1a;如何用Office Custom UI Editor轻松打造专属办公界面 【免费下载链接】office-custom-ui-editor Standalone tool to edit custom UI part of Office open document file format 项目地址: https://gitcode.com/gh_mirrors/of/office-custom-ui-editor …

作者头像 李华
网站建设 2026/5/17 8:03:30

Arm Neoverse CMN-700 HN-F寄存器架构与缓存一致性配置详解

1. Arm Neoverse CMN-700 HN-F寄存器架构概述在现代SoC设计中&#xff0c;一致性互连网络&#xff08;Coherent Mesh Network&#xff09;是实现多核处理器高效协同工作的核心基础设施。作为Arm Neoverse平台的关键组件&#xff0c;CMN-700通过其独特的网格拓扑结构和分布式节点…

作者头像 李华