题目描述
思路解析动画文字版
记住这套「各找老大 → 老大不同就合并、省份减一 → 老大相同就跳过」,下面每条相连关系都在套它。
准备 · 各自为省:开局:6 个城市各自为省,每个城市的老大都是自己(没有箭头)。省份数从 6 起步,接下来按相连关系一对对合并。
看 (0, 1):相连关系 (0, 1):城市 0 和 1 直接相连,先各自往上找老大(根)。
找根 · 0→0, 1→1:顺着父指针往上爬:0 的根是 0,1 的根是 1。两者根不同。比的是根、不是直接父亲。
合并 · 根 0→1:0 的老大是 0、1 的老大是 1,不同根 → 合并!把根 0 挂到根 1 下面,两省并成一省,省份数减一变成 5。
看 (1, 2):相连关系 (1, 2):城市 1 和 2 直接相连,先各自往上找老大(根)。
找根 · 1→1, 2→2:顺着父指针往上爬:1 的根是 1,2 的根是 2。两者根不同。比的是根、不是直接父亲。
合并 · 根 1→2:1 的老大是 1、2 的老大是 2,不同根 → 合并!把根 1 挂到根 2 下面,两省并成一省,省份数减一变成 4。
看 (0, 2):相连关系 (0, 2):城市 0 和 2 直接相连,先各自往上找老大(根)。
找根 · 0→2, 2→2:顺着父指针往上爬:0 的根是 2,2 的根是 2。两者同根。比的是根、不是直接父亲。
跳过 · 已同省 2:0 和 2 的老大都是 2,已经同省了,无需合并,直接跳过。省份数不变,还是 4。
看 (3, 4):相连关系 (3, 4):城市 3 和 4 直接相连,先各自往上找老大(根)。
找根 · 3→3, 4→4:顺着父指针往上爬:3 的根是 3,4 的根是 4。两者根不同。比的是根、不是直接父亲。
合并 · 根 3→4:3 的老大是 3、4 的老大是 4,不同根 → 合并!把根 3 挂到根 4 下面,两省并成一省,省份数减一变成 3。
看 (4, 5):相连关系 (4, 5):城市 4 和 5 直接相连,先各自往上找老大(根)。
找根 · 4→4, 5→5:顺着父指针往上爬:4 的根是 4,5 的根是 5。两者根不同。比的是根、不是直接父亲。
合并 · 根 4→5:4 的老大是 4、5 的老大是 5,不同根 → 合并!把根 4 挂到根 5 下面,两省并成一省,省份数减一变成 2。
看 (3, 5):相连关系 (3, 5):城市 3 和 5 直接相连,先各自往上找老大(根)。
找根 · 3→5, 5→5:顺着父指针往上爬:3 的根是 5,5 的根是 5。两者同根。比的是根、不是直接父亲。
跳过 · 已同省 5:3 和 5 的老大都是 5,已经同省了,无需合并,直接跳过。省份数不变,还是 2。
完成 · 数根:所有相连关系处理完,城市归并成 2 棵树(2 个不同的根)——也就是 2 个省。同色的城市同属一省。这就是并查集数连通块的全部威力。
边界先想清:互不相连取 n、全相连取 1、单城取 1——靠「初始 count=n + 每次成功合并减一」自然得出。
三个高频追问:路径压缩+按秩合并两大优化、DFS 等价解法、以及并查集的最佳适用场景。
参考代码
def findCircleNum(isConnected): n = len(isConnected) parent = list(range(n)) # 每个城市老大=自己 count = n def find(x): while parent[x] != x: parent[x] = parent[parent[x]] # 路径压缩 x = parent[x] return x for i in range(n): for j in range(i+1, n): if isConnected[i][j]: ri, rj = find(i), find(j) if ri != rj: parent[ri] = rj # 合并 count -= 1 # 省份减一 return count复杂度
- 时间:O(n²·α),扫 n² 的矩阵,每次 find/union 近似 O(1)(α 反阿克曼)
- 空间:O(n),只用一个长度 n 的 parent 数组
易错点
面试追问把动画讲成自己的话
追问并查集的两个优化是什么?
追问这题能用 DFS/BFS 做吗?
追问什么时候首选并查集?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
冗余连接
LeetCode 684 · 中等 · 沿着 图论套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题