1. 题目背景与核心需求
LeetCode 684 "冗余的边"是一道经典的图论问题,属于并查集(Union-Find)算法的典型应用场景。题目给定一个无向图,该图由一棵树加上一条额外的边构成,要求找出这条导致图中出现环的冗余边。
在实际编程面试中,这类问题经常出现在大厂的算法考察环节。我在准备机考时发现,很多同学对并查集的理解停留在表面,遇到变种题目就容易卡壳。这道题正好能帮助我们深入掌握并查集的核心思想。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与算法选择
2.1 题目形式化描述
给定一个边列表edges表示的无向图,其中edges[i] = [a, b]表示节点a和b之间的连接。该图原本是一棵树,后来添加了一条边。需要找出那条添加后导致环出现的边。
示例:
输入:edges = [[1,2], [1,3], [2,3]]
输出:[2,3]
2.2 解题思路比较
常见的解法主要有两种:
- DFS/BFS遍历法:每次添加边前检查两点是否已连通
- 并查集(Union-Find)法:动态维护连通分量
经过实际测试,当节点数N较大时(比如N>1000),并查集解法在时间复杂度上更有优势:
- DFS/BFS:O(N^2) 最坏情况
- 并查集:O(Nα(N)) ≈ O(N) (α为反阿克曼函数)
提示:面试时如果被问到时间复杂度,需要解释清楚α(N)的含义
3. 并查集实现详解
3.1 数据结构设计
标准的并查集需要实现两个核心操作:
- find(x): 查找x的根节点
- union(x, y): 合并x和y所在集合
python复制class UnionFind:
def __init__(self, size):
self.parent = list(range(size+1)) # 节点从1开始编号
self.rank = [0]*(size+1)
def find(self, x):
while self.parent[x] != x:
self.parent[x] = self.parent[self.parent[x]] # 路径压缩
x = self
