首页/新闻资讯/正文详情

高频必考!并查集:动态连通性“找根 + 合并”模板,面试必背

发布时间:2026/9/26 4:15:52 来源:云帆数科 栏目:资讯中心
高频必考!并查集:动态连通性“找根 + 合并”模板,面试必背
我们用DFS数过岛屿——那是“静态地求连通块”。如果问题是边一条条加进来随时问“这两点通了吗”“加这条边会不会成环”DFS每次重扫就太慢了。这时就轮到并查集Union-Find出场。它只干两件事find(x)找根union(x,y)合并。操作近乎O(1)是处理动态连通性的瑞士军刀。今天用LC.547「省份数量」把这套面试必背模板彻底打透——parent数组 路径压缩 按大小合并三件套一次到位。 题目速览 LC.54730秒读懂n个城市isConnected[i][j] 1表示i城与j城直接相连。省份是一组直接或间接相连的城市集合。返回省份数量。示例[[1,1,0],[1,1,0],[0,0,1]]→ 输出2城市0-1一省城市2一省示例[[1,0,0],[0,1,0],[0,0,1]]→ 输出3三城互不相连约束n ≤ 200矩阵对称对角线为1。 核心思路把连通性变成“认根”不同根数就是省份数DFS能做但不够优雅从每个未访问节点出发DFS走完整块连通分量——数岛的孪生版。能做但每次查“两点通不通”都得搜一遍不适合动态场景。并查集每个集合选一个“根”代表自己初始n个城市各成一派parent[i] i读邻接矩阵凡isConnected[i][j] 1就union(i, j)最后不同根的数量 连通分量省份数查询“i、j通不通”只需find(i) find(j)O(1)级别。 两个让并查集起飞的优化必背1. 路径压缩Path Compressionfind时把沿途节点直接挂到根上下次再查一步到位parent[x]parent[parent[x]]# 沿途挂到爷爷压缩链2. 按秩/大小合并Union by Rank/Sizeunion时把“矮的树”挂到“高的树”根下避免链化。单独按秩合并→ 树高O(logn)路径压缩 按秩合并→ 单次操作均摊O(α(n))α是阿克曼反函数增长极慢n取宇宙原子数都不到5——实际可视为常数时间。为什么并查集比DFS强本题一次性给全关系DFS完全够用。但并查集的杀手锏是动态性边一条条来随时问连通性随时判环加边前find(u)find(v)就说明会成环这种“在线/动态”场景 DFS 力不从心并查集游刃有余。️ 图解算法手把手走一遍isConnected [[1,1,0],[1,1,0],[0,0,1]]城市0,1,2初始parent [0, 1, 2]各自为根 读 (0,1)1 → union(0,1) 按大小合并0、1都单点把1挂到 0 parent [0, 0, 2] 读 (0,2)0 / (1,2)0 → 不连通跳过 读 (1,0) 已处理对称跳过对角线 (i,i) 跳过 最终 parent [0, 0, 2] 根为0代表城市0、1、根为2代表城市2 不同根集合{0,1}, {2} → 2 个省份 ✅关键观察union(0,1)后无论查find(0)还是find(1)都得到同一个根0——“认根即认亲”。若再加一条 (1,2)1则union(1,2)把根2挂到根0三城归一省。 代码实现Python JavaPython版完整模板路径压缩 按大小合并classSolution:deffindCircleNum(self,isConnected:List[List[int]])-int:nlen(isConnected)parentlist(range(n))# 初始各自为根size[1]*n# 每棵树大小用于按大小合并deffind(x):# 路径压缩whilex!parent[x]:parent[x]parent[parent[x]]# 沿途挂到爷爷xparent[x]returnxdefunion(x,y):# 按大小合并rx,ryfind(x),find(y)ifrxry:return# 已同根ifsize[rx]size[ry]:parent[rx]ry size[ry]size[rx]else:parent[ry]rx size[rx]size[ry]foriinrange(n):forjinrange(i1,n):# 只扫上三角避免重复ifisConnected[i][j]1:union(i,j)rootsset(find(i)foriinrange(n))returnlen(roots)# 不同根数 省份数Java版classSolution{privateint[]parent;privateint[]size;publicintfindCircleNum(int[][]isConnected){intnisConnected.length;parentnewint[n];sizenewint[n];for(inti0;in;i){parent[i]i;size[i]1;}for(inti0;in;i){for(intji1;jn;j){if(isConnected[i][j]1)union(i,j);}}intcnt0;for(inti0;in;i)if(parent[i]i)cnt;returncnt;}privateintfind(intx){// 路径压缩while(x!parent[x]){parent[x]parent[parent[x]];xparent[x];}returnx;}privatevoidunion(intx,inty){// 按大小合并intrxfind(x),ryfind(y);if(rxry)return;if(size[rx]size[ry]){parent[rx]ry;size[ry]size[rx];}else{parent[ry]rx;size[rx]size[ry];}}}⚠️防坑提醒必看parent初始parent[i]i自己就是自己的根。find用迭代写法避免深递归栈溢出。只遍历上三角ji矩阵对称减少一半union。“数根”两种写法统计parent[i]i或收集find(i)去重结果一致。⏱️ 复杂度分析面试必问版本时间空间路径压缩 按大小合并O(n²·α(n)) ≈ O(n²)O(n)朴素并查集O(n²·n)链化退化O(n)α(n)是阿克曼反函数n极大时也 5实际视为常数。比DFS的递归栈/visited矩阵更省空间。 举一反三4 道高频变体题题目变化点思路要点LC.200 岛屿数量网格连通块把相邻1当边union或DFSLC.684 冗余连接给树一条多余边找成环的那条边依次union首次find(u)find(v)即环边LC.1319 连通网络的操作次数最少连线使全网连通并查集求连通分量数c答案 c-1LC.990 等式方程的可满足性等式/不等式混合先union所有等式再检查不等式是否冲突 面试追问模拟提前准备惊艳全场Q1路径压缩 按秩合并为什么能降到O(α(n))单独按秩合并树高限制为O(logn)单独路径压缩单次可能O(n)但均摊小。两者结合时路径压缩不停“拍平”树按秩保证合并不乱长高。经势能分析证明单次操作均摊O(α(n))。α(n)增长比log还慢n取天文数字仍 5——实际当常数用。Q2并查集 vs DFS求连通分量怎么选静态图、只求一次连通块两者都行DFS代码更短。边逐步加入、反复回答“两点通不通 / 加边会不会成环”并查集天选每次查询/合并近乎O(1)DFS每次都得重搜。一句话静态用DFS动态用并查集。Q3并查集经典扩展有哪些① 找环边LC.684边依次union遇到find(u)find(v)说明这条边把已连通的两点又连了一次必成环② 最小生成树Kruskal用并查集判“加这条边会不会成环”③ 连通网络操作次数LC.1319先算现有c个连通分量最少补c-1条边即全连通。 实战小技巧刷题党必备口诀parent数组各自根find找根路径压union合并小的挂大的。模板并查集 parent size find union四件套背下来。防坑find用迭代防爆栈只扫上三角数根别数错。 实际应用场景不止是刷题社交网络朋友圈/共同群组合并图像处理连通区域标记海量像素动态合并网络监控链路动态增删时实时判断两节点是否可达编译器等价变量合并寄存器分配经典应用分布式系统分区检测 今日思考题如果面试官把LC.547改成“边一条条实时到来每加一条就问一次当前有几座省份”DFS还能胜任吗提示并查集每次加边只需一次union维护一个“当前根数”变量加边时若合并成功则根数-1。

相关推荐

家教线上线下一体化平台的搭建思路,围绕五大核心功能、三种落地推广方式
家教线上线下一体化平台的搭建思路,围绕五大核心功能、三种落地推广方式

大家好,我是北京金雨科技李东旭,2004年开始从事网站业务,有22年经验,长期从事网站建设与系统开发。今天和大家拆解家教线上线下一体化平台的搭建思路,围绕五大核心功能、三种落地推广方式,聊聊如何打造精细… · 2026/9/26 4:15:52

前后端分离计算器系统(Flask + SQLite + HTML/CSS/JS)
前后端分离计算器系统(Flask + SQLite + HTML/CSS/JS)

Frontend/Backend Separated Calculator System — Assignment Blog Table of ContentsFrontend/Backend Separated Calculator System — Assignment Blog1. Course Information2. Git Repository Link and Code Standards Link3. PSP Table4. Presentation of the Finished P… · 2026/9/26 4:15:52

AI编程助手反复读上下文?原理、优化方法与工具实测
AI编程助手反复读上下文?原理、优化方法与工具实测

从一次深夜改 Bug 的经历说起。我让 AI 编程助手帮忙排查一个登录接口的报错,它先是读了一遍项目结构,又把 package.json、路由文件、配置文件挨个拉进上下文,最后还翻了几个看似无关的工具函数。前后不过十分钟,令牌消耗却抵得上… · 2026/9/26 4:15:52

车载以太网与TSN:汽车EE架构中的确定性通信设计实践
车载以太网与TSN:汽车EE架构中的确定性通信设计实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 6:14:21

QRFR分位数回归森林:用Python从点预测升级为区间预测
QRFR分位数回归森林:用Python从点预测升级为区间预测

简介:面向具备 Python 与机器学习基础的开发者和数据科学从业者,也可供相关行业数据分析人员参考。资料围绕随机森林分位数回归(QRFR)展开,解决传统回归只有点预测、难以刻画不确定性的问题,说明如何基于 P… · 2026/9/26 6:14:21

RLHF、RLAIF与RLVR:大模型对齐的工程选型指南
RLHF、RLAIF与RLVR:大模型对齐的工程选型指南

1. 这不是三套“高大上”名词的堆砌,而是对齐工程中三条真实技术路径的实战选择你打开一篇论文,看到标题里写着“RLHF vs RLAIF vs RLVR”,第一反应可能是:又一个术语拼盘?但如果你正在调试一个大模型微调流程&#xf… · 2026/9/26 6:14:15

鸿蒙ArkTS智慧农业作物管理:从种植建档到农事追溯
鸿蒙ArkTS智慧农业作物管理:从种植建档到农事追溯

1. 内容整体设计与思路拆解聊了八篇鸿蒙开发,设备接入、数据采集、协议解析都理顺了,后台收到的留言多起来,问得最多的问题基本一致:数据收上来之后怎么变成农户真正愿意用的东西?所以第9篇我把焦点从底层链路拉回到业… · 2026/9/26 6:14:03

运输问题与指派问题:从线性规划建模到匈牙利算法的运筹实战
运输问题与指派问题:从线性规划建模到匈牙利算法的运筹实战

简介:运输问题与指派问题是运筹学中经典的资源优化分配模型,广泛应用于物流调运、生产调度与任务分配场景。这份PPT学习教案面向运筹学初学者及相关专业学生,系统讲解两类问题的基本概念、数学模型和电子表格建模方法,重点涵盖产销… · 2026/9/26 6:14:03

MinGW-w64离线安装完全指南:环境确定性与ABI兼容性保障
MinGW-w64离线安装完全指南:环境确定性与ABI兼容性保障

1. 为什么“离线安装”这件事,在嵌入式开发、军工仿真和教育机房里,比网速还重要MinGW-w64不是个新东西,但每次在客户现场打开官网下载页面,看到那个写着“Download from SourceForge”的蓝色按钮,我就下意识点开任务管… · 2026/9/26 6:14:03

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码