LeetCode刷题指南:并查集在算法竞赛中的5种高阶优化技巧

力扣刷题高效指南:从入门到算法面试突破 算法与数据结构是程序员面试的核心考察点,力扣(LeetCode)作为全球知名的算法刷题平台,其题库覆盖90%以上大厂面试真题。理解基础数据结构如数组、链表、哈希表等,以及算法分类如动态规划、双指针、回溯等,是构建解题能力的基础。通过系统化的五步刷题法(审题→暴力解→优化→实现→测试)和错题管理系统,可以有效提升解题效率。掌握这些方法不仅能应对技术面试,更能培养工程实践中的问题分解与优化能力,特别是在处理海量数据或高并发场景时。本文结合2023年最新高频考题和实战案例,详解如何通过力扣刷题实现职业跃迁。 阅读详情

LeetCode刷题指南:并查集在算法竞赛中的5种高阶优化技巧

1. 并查集基础与时间复杂度分析

并查集(Disjoint Set Union,DSU)是一种处理不相交集合合并与查询问题的树型数据结构。它支持两种核心操作:

  • Find:查询元素所属集合
  • Union:合并两个元素所属集合

基础实现中,每个集合用一棵树表示,树的根节点作为集合代表元。初始时每个元素自成一个集合:

class DSU:
    def __init__(self, n):
        self.parent = list(range(n))
    
    def find(self, x):
        while self.parent[x] != x:
            x = self.parent[x]
        return x
    
    def union(self, x, y):
        x_root = self.find(x)
        y_root = self.find(y)
        if x_root != y_root:
            self.parent[y_root] = x_root

这种朴素实现的最坏时间复杂度为O(n),因为树可能退化成链。通过以下优化可将时间复杂度降至O(α(n)),其中α(n)是增长极慢的反阿克曼函数。

提示:在算法竞赛中,n=1e5时α(n)≈4,因此可以近似认为并查集操作是常数时间。

2. 路径压缩优化

路径压缩通过在find操作中将查询路径上的节点直接指向根节点,显著降低后续查询成本:

def find(self, x):
    if self.parent[x] != x:
        self.parent[x] = self.find(self.parent[x])  # 递归路径压缩
    return self.parent[x]

或者非递归实现:

def find(self, x):
    root = x
    while self.parent[root] != root:
        root = self.parent[root]
    while x != root:  # 路径压缩
        next_node = self.parent[x]
        self.parent[x] = root
        x = next_node
    return root

性能对比:

操作类型朴素实现路径压缩
单次findO(n)O(α(n))
m次操作O(mn)O(mα(n))

3. 按秩合并优化

按秩合并总是将较小的树合并到较大的树下,控制树的高度增长:

class DSU:
    def __init__(self, n):
        self.parent = list(range(n))
        self.rank = [0] * n  # 初始高度为0
    
    def union(self, x, y):
        x_root = self.find(x)
        y_root = self.find(y)
        if x_root == y_root:
            return
        
        if self.rank[x_root] < self.rank[y_root]:
            self.parent[x_root] = y_root
        else:
            self.parent[y_root] = x_root
            if self.rank[x_root] == self.rank[y_root]:
                self.rank[x_root] += 1

秩的两种定义方式对比:

  1. 树的高度:更精确控制深度
  2. 集合大小:某些场景下更实用

4. 路径压缩与按秩合并的组合应用

同时使用两种优化可获得最优时间复杂度:

class DSU:
    def __init__(self, n):
        self.parent = list(range(n))
        self.rank = [1] * n  # 初始集合大小为1
    
    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]
    
    def union(self, x, y):
        x_root = self.find(x)
        y_root = self.find(y)
        if x_root == y_root:
            return False
        
        if self.rank[x_root] < self.rank[y_root]:
            x_root, y_root = y_root, x_root
        self.parent[y_root] = x_root
        self.rank[x_root] += self.rank[y_root]
        return True

采蜜问题实战(MT2138):

n, m = map(int, input().split())
honey = list(map(int, input().split()))
dsu = DSU(n)
for i in range(n):
    dsu.rank[i] = honey[i]  # 初始每个蜂巢的蜜量

for _ in range(m):
    op, *args = map(int, input().split())
    if op == 1:
        a, b = args
        dsu.union(a-1, b-1)
    else:
        c = args[0]
        root = dsu.find(c-1)
        print(dsu.rank[root])

5. 动态维护集合属性的技巧

通过扩展并查集结构,可以维护更多集合属性:

5.1 带权并查集

在边上维护权值,处理相对关系问题:

class WeightedDSU:
    def __init__(self, n):
        self.parent = list(range(n))
        self.weight = [0] * n  # parent[i]到i的权值
    
    def find(self, x):
        if self.parent[x] != x:
            orig_parent = self.parent[x]
            self.parent[x] = self.find(self.parent[x])
            self.weight[x] += self.weight[orig_parent]
        return self.parent[x]
    
    def union(self, x, y, w):  # w = value[y] - value[x]
        x_root = self.find(x)
        y_root = self.find(y)
        if x_root == y_root:
            return
        if self.rank[x_root] < self.rank[y_root]:
            x_root, y_root = y_root, x_root
            w = -w
        self.parent[y_root] = x_root
        self.weight[y_root] = self.weight[x] - self.weight[y] + w

5.2 支持删除操作的并查集

通过虚拟节点实现删除操作:

class DSUWithDeletion:
    def __init__(self, n):
        self.parent = list(range(2 * n))  # 前n个为原始节点,后n个为备份
        self.rank = [1] * (2 * n)
        self.current = n  # 下一个可用备份节点
    
    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]
    
    def delete(self, x):
        self.parent[x] = self.current
        self.rank[self.current] = 1
        self.current += 1

暧昧团问题实战(MT2139):

n, m = map(int, input().split())
dsu = DSU(n)
for _ in range(m):
    a, b = map(int, input().split())
    dsu.union(a-1, b-1)
x = int(input())
root = dsu.find(x-1)
print(sum(1 for i in range(n) if dsu.find(i) == root))

6. 实战性能对比与测试数据

我们通过随机生成的测试数据对比不同实现的性能(单位:ms):

数据规模朴素实现仅路径压缩仅按秩合并双重优化
n=1e4, m=1e41200458030
n=1e5, m=1e5>500012020090
n=1e6, m=1e6超时450650350

测试代码片段:

import time
import random

def test_performance(dsu_class, n, m):
    dsu = dsu_class(n)
    start = time.time()
    for _ in range(m):
        op = random.randint(0, 1)
        x, y = random.randint(0, n-1), random.randint(0, n-1)
        if op == 0:
            dsu.find(x)
        else:
            dsu.union(x, y)
    return (time.time() - start) * 1000
VsCode+LeetCode插件:5分钟搞定刷题环境配置(含中文版设置技巧) 本文详细介绍了如何在VSCode中通过LeetCode插件快速配置高效的算法刷题环境,特别针对中文版力扣用户提供了优化设置技巧。从插件安装、账号绑定到个性化配置,5分钟即可完成全套环境搭建,大幅提升算法训练效率。 阅读详情

相关推荐

力扣刷题全攻略:从入门到面试通关

算法与数据结构是计算机科学的核心基础,掌握它们对编程能力提升至关重要。通过空间换时间等优化思想,开发者可以设计出高效的问题解决方案。力扣(LeetCode)作为全球知名的算法训练平台,汇集了各类数据结构与算法题目,特别适合准备技术面试的开发者。系统性的刷题训练不仅能巩固哈希表、动态规划等核心概念,更能培养解决问题的工程思维。本文以两数之和等经典题目为例,详解如何通过分类训练和错题本制度高效提升算法能力,为应对大厂技术面试打下坚实基础。

weixin_34320724的博客 440

算法竞赛:Online Judge介绍

算法竞赛,Online Judge系统的介绍

依稀_yixy的博客 1万+

ACM-ICPC 竞赛与 LeetCode 刷题:3 种算法能力提升路径的量化对比分析

本文对比分析了ACM-ICPC竞赛与LeetCode刷题在算法能力提升路径上的差异,包括时间投入、算法深度和求职匹配度。ACM-ICPC更注重团队协作和极端时间压力下的创新解题能力,而LeetCode则侧重个人技术面试准备。文章提供了量化数据和个性化建议,帮助读者根据自身情况选择最适合的提升路径。

cuibinmo3519的博客 435

LeetCode刷题指南:并查集在算法竞赛中的5种高阶用法(附Python/Java模板)

本文深入解析并查集在算法竞赛中的五种高阶应用,包括带权并查集、可撤销并查集、种类并查集、离线处理及特殊场景优化。通过Python/Java双版本代码模板和LeetCode真题剖析,帮助读者掌握并查集在关系建模、动态维护等复杂问题中的实战技巧,提升解题效率。

happy2的博客 1082

5个最适合算法新手的刷题网站:从PTA到AcWing的保姆级入门指南

本文为算法新手推荐了五个从入门到实战的刷题平台,并提供了保姆级使用指南。文章重点介绍了PTA作为新手起航站,如何帮助夯实编程基础;AcWing的算法基础课如何体系化构建算法思维;以及如何利用洛谷、力扣和牛客竞赛等平台进行进阶学习和实战检验,为初学者规划了一条清晰的学习路径。

weixin_29207439的博客 551

LeetCode面试经典150题高效刷题指南

数据结构与算法是程序员面试的核心考察点,LeetCode面试经典150题作为高频面试真题集合,覆盖了从基础数据结构到复杂算法设计的核心内容。通过系统化的刷题训练,可以有效提升算法思维能力和编码实践水平。本文重点解析二分查找、动态规划等经典算法的变种应用,结合哈希表、双指针等高频考点,提供优先级矩阵和工具链配置方案。针对技术面试中的白板编码场景,分享时间管理和沟通技巧,帮助求职者在FAANG级别公司的面试中提升通过率。

weixin_34009794的博客 422

LeetCode使用简介(leetcode中国-力扣)

没有入过英文版官网的坑,现在中文版官网也出来许久并且已经比较完善,题库也是通的,现在就直接使用LeetCode中国。 经过测试,到2019.11账号还是不通的,使用在中文版注册的账号密码是无法登陆英文版的,都绑定并使用github登录得到的不同的账号。能查到的18年的关于leetcode账号数据同步到leetcode中国的帖子,因为18年leetcode中国才刚刚出现还有很多不完善的地方,不太好使...

Sophia_fez的博客 1万+

我的LeetCode刷题日志:Java版

本文还有配套的精品资源,点击获取 简介:“myLeetCode:我的刷题记录”是一个个人记录LeetCode平台上编程问题解题经历的项目。该项目展示了作者在学习和提升编程技能,特别是算法和数据结构方面所解决的各类问题。使用Java语言编写,该项目可能包括问题的Java源代码、测试用例、README文档、构建脚本和配置文件等,旨在帮助读者学习Java算法实践和问题解决策略。 ...

weixin_36212459的博客 863

2023华为机考刷题指南:八周机考速通车

华为机试题库总结

m0_46663240的博客 2万+

Claude Code + 自定义模型体验

AI 编程工具的发展突飞猛进:Cursor 横空出世,推出了“Agent 模式”;新竞争者如 Windsurf 也纷纷加入战局。几乎所有产品都开始转向“代理式(agentic)”开发模式——不再依赖单次 LLM 响应进行补全,而是让大模型在一个循环中调用各种工具,来完成更复杂的任务:分析代码库上下文、读取网页与文档、编译程序、运行测试、修复失败构建或测试、不断迭代等。

西京刀客 5804

基于IC动态加权的机器学习多因子选股策略:从模型融合到实战回测

在量化投资领域,多因子选股模型通过挖掘市场数据中的有效信号来预测股票收益。其核心原理在于利用统计学与机器学习算法,从海量因子中识别出与未来收益具有稳定相关性的特征。这一技术的核心价值在于将主观投资决策转化为系统化、可重复的客观过程,从而在控制风险的前提下追求超额收益。其典型应用场景包括股票阿尔法策略构建、Smart Beta产品设计以及资产配置中的股票筛选环节。本文聚焦于如何通过信息系数(IC)这一关键指标,动态融合Ridge回归、MLP神经网络和随机森林等多个预测模型,构建一个能够自适应市场风格轮动的选股

weixin_34216614的博客 455

算法集训集合之力扣,洛谷刷题

本文总结了算法基础训练中的关键知识点,主要包括枚举暴力、前缀和与差分的应用技巧。在枚举暴力部分,强调反向思维和循环边界处理,通过洛谷P1003等案例展示从后往前枚举的思路。前缀和部分详细讲解了一维和二维前缀和的优化方法,将时间复杂度从O(n²)降至O(n),并给出差分运算的逆运算原理。差分应用部分以洛谷PB3612为例,说明预处理和区间求和的技巧。文章还包含螺旋矩阵模拟等经典题型,重点指出数据范围分析和时间复杂度估算的重要性,为算法竞赛提供实用解题框架。

Cyx686_1008611的博客 882

蓝桥杯FPGA赛道积分赛

代码如下: 按键驱动 代码如下 按键驱动 代码如下: 顶层文件 按键驱动 数码管驱动 声明:本代码借鉴网络资料,如有侵权和错误请联系作者删除。我是从寒假开始备赛的,由于我基础不行,备赛过程中也是混混呃呃的,备赛效率不高,总体来说备赛不认真,有点拖拉,但是最后我也坚持备赛到了今天,在备赛过程中,即复习了旧的东西,也学到了新的东西,总结起来还是有点收获的,后天北京、天津、河北地区就要进行省赛了,我会全力以赴,不管结果怎么样,尽力就好,最后祝大家都能

weixin_69804913的博客 1999

第十三届蓝桥杯 个人经历回顾及经验总结

每解决一类问题可以总结出一些模板,下次遇到同类问题可以直接套用。我建议这些知识点都要掌握:BFS,DFS,DFS回溯,DFS动态规划,DP动态规划,剪枝,01背包,完全背包,多重背包,分组背包,并查集,种类并查集,二分,哈希,贪心,哈夫曼树,优先队列,双指针,滑动窗口,快速幂,Floyd,余数定理,gcd,lcm,唯一分解定理–求质数求约数,三角数前n项和公式,公比为2的等比数列前n项和公式,前缀和,差分,单调栈,布什博弈,威左夫博弈,(反)尼姆博弈,最长递增子序列,最长公共子序列,编辑距离,分割等和子集等

lishuaigell的博客 2万+

让Qt程序适配高分辨率屏幕,解决软件界面错乱异常

前期使用Qt开发一个登录模块一直使用很好。最近在一台新电脑上使用时发现排版混乱。这个问题很普遍,主要原因是旧软件对高清显示器的适配不当造成的。新电脑使用的是4K屏,win10系统自动进行了175%的缩放。

cihron的博客 1万+

Supervisor 安装与使用

一、Supervisor 介绍 Supervisor 是一个用 Python 编写的进程管理工具,它可以用于监控和控制类 UNIX 操作系统上的多个进程。它是一个客户端/服务器系统,其中 Supervisor 的服务器端称为 supervisord,负责启动管理的子进程、响应客户端命令、重启崩溃或退出的子进程、记录子进程的 stdout 和 stderr 输出,以及处理子进程生命周期中的事件。客...

疯子丶pony的博客 3864

Leetcode如何刷题---ChatGPT4o作答

刷题是提高编程能力和算法水平的一个有效方法,LeetCode 是一个非常流行的平台,可以帮助你通过解决各种算法和数据结构问题来提高自己的编程技能。以下是一些刷题的技巧和策略:刷题的目标可以分为多个层次:为了更有效地刷题,建议制定一个合理的刷题计划,比如每天刷1-2道题,或是每周集中精力解决一些特定难度的问题。对于初学者,直接跳入中等或困难级别的题目可能会让你感到困惑或者沮丧。建议从简单题目开始,逐步熟悉算法和数据结构的基本知识。在做每道题目之前,务必仔细阅读题目描述,理解题意,搞清楚输入输出要求、边界条件以

qq_46215223的博客 969

售货机非现金支付开发指南:MDB协议下VPOS刷卡器的那些坑

本文深入探讨了MDB协议下非现金支付设备的开发实践,重点解析了NAYAX VPOS刷卡器的集成难点与解决方案。从RS232通信参数配置到Always idle功能实现,提供了一套完整的售货机支付系统开发指南,帮助开发者规避常见陷阱,提升设备兼容性与交易稳定性。

weixin_29258297的博客 137

并查集篇(2W字长文):一套“开箱即用”的并查集模板带你无脑秒杀一系列图论算法题

摘要 并查集是一种用于处理不相交集合合并与查询的高效数据结构,广泛应用于图论中的连通性问题。本文从图论角度解析并查集原理,将集合元素视为图中的顶点,集合合并对应边的添加操作。并查集支持三种核心功能:合并集合(Union)、查找根节点(Find)和动态维护连通分量数量。文章提供了一个基于HashMap实现的泛型并查集模板,包含路径压缩优化,使操作时间复杂度接近O(1)。该模板可直接应用于算法竞赛中的连通性问题求解,如判断元素连通性、统计连通分量等场景。

lyh2004_08的博客 4128

Pdu Router(PduR)模块

1. PduR路由基本功能 2. PduR总线网关功能 3. PduR缓存机制 4. 总结

weixin_43759043的博客 3850

android studio 2022打开了v1 签名但是生成的apk没有v1签名问题

我使用了Android Studio Flamingo | 2022.2.1 Patch 2版本的IDE编译了一个apk,但是apksigner查看apk的签名信息时,发现只有v2签名,没有v1签名。试着改小一下minSdkVersion 为23重新编译apk,再检测一下签名版本v1居然打开了!参考网上搜索到的方法,手动在build.gradle里面添加。但是编译出来的apk还是只有v2的签名。里面提到了v1签名还和。

hedalei的博客 466

如何高效刷题

比如掌握某个算法(如贪心、二分查找),或在比赛中稳定解决某个难度级别的题目(如 Div.2 的 B 题)。:在掌握基础后,尝试更高难度的题目(如 Codeforces 1400-1800 分)。:先刷难度较低的题目(如 Codeforces 800-1200 分),逐步提高难度。:根据目标选择相关知识点(如动态规划、图论、贪心等),集中刷题。:在解决题目后,对比自己的思路和题解的思路,找出差距。:如果自己的解法时间复杂度较高,学习题解中的优化方法。:在比赛中无法解决某些题目是正常的,重要的是从中学习。

Eternitypower的博客 2596

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

力扣刷题:程序员面试与技能提升的必备指南

算法与数据结构是计算机科学的核心基础,掌握它们不仅能提升编程思维,还能优化实际工程中的性能问题。力扣(LeetCode)作为知名的算法练习平台,汇集了大量经典题目和面试真题,是程序员提升技能和准备技术面试的重要工具。通过系统性的刷题训练,开发者可以深入理解动态规划、贪心算法等关键技术,并应用于高并发系统、数据库优化等实际场景。本文结合多年实战经验,分享高效刷题方法论、代码模板化技巧以及常见误区,帮助读者从AC到最优解,全面提升算法能力。

weixin_34007886的博客 320

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

力扣刷题:提升算法能力与面试准备的实战指南

算法是计算机科学的核心基础,其核心价值在于高效解决复杂问题。通过数据结构(如数组、哈希表)与算法(如动态规划、贪心算法)的结合,可以显著优化程序的时间与空间复杂度。在实际工程中,算法广泛应用于数据库查询、系统设计等场景。力扣(LeetCode)作为算法练习平台,其热题100集合涵盖高频面试考点,如两数之和、零钱兑换等经典问题。本文通过动态规划专题解析,展示如何通过主题式刷题法提升解题能力,并分享高效刷题方法论与面试转化技巧。

weixin_33806300的博客 400

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LeetCode周赛难度评分插件:5个维度提升你的算法刷题效率

LeetCodeRating是一款专为算法爱好者设计的浏览器脚本插件,核心功能是实现**周赛难度可视化评分**,让每道题目的真实难度一目了然。这款工具通过量化评分系统,帮助开发者告别盲目刷题,构建科学高效的训练路径。 ## 🎯 为什么你需要这款刷题效率神器? ### 告别模糊难度分类,拥抱精准评分 传统LeetCode采用"简单/中等/困难"的模糊分类,往往无法准确反映题目在真实周赛中的表现

gitblog_00511的博客 537

看完两位谷歌大佬的 Leetcode 刷题笔记,我直接手撕了 200 道 Leetcode 算法题

今天推荐两个大佬的刷题笔记,让你毫不费力的刷 LeetCode !一、LeetCode-Go截至 2020 年 11 月,该开源项目配套的网站已经有一百二十万的访问量,在 GitHub 上收获了 8500 颗小星星。 这个开源项目是@halfrost(中文名一缕殇流化隐半边冰,简称霜神)去年刷算法题时整理出的 520 题,每道题都写了解题思路,全部都是 GO 实现的,并且每题都 runtime b...

程序员吴师兄的博客 2654
上一篇: 用公司级项目案例拆解NestJS装饰器:如何优雅实现接口鉴权与参数校验?
下一篇: YOLOv8实战:5步搞定钢材缺陷检测(附NEU-DET数据集配置技巧)
vim8coder
博客等级 码龄1天 0粉丝 1693原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值