力扣 0645 错误的集合(Set Mismatch):哈希表与数学方法双解法实战解析
教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载本文为 AlgoNote「算法通关手册」系列题解完整解析 0645. 错误的集合 这道标签为「位运算、数组、哈希表、排序」的简单难度题目如何在数组恰好出现「一个数字重复、一个数字丢失」时以数组形式同时返回重复数与丢失数。读完本文你将掌握哈希表频率统计、和与平方和联立方程两种解法并能理解二者在时间复杂度、空间复杂度上的取舍以及边界条件与溢出风险。题目解读与约束集合 $S$ 原本包含从 $1$ 到 $n$ 的连续整数但数据出错后「某一个数字复制成了集合里面另外一个数字的值」导致最终数组 $nums$ 中同时存在一个重复数字和一个丢失数字。题目要求找出重复出现的整数与丢失的整数并按[重复的数字, 丢失的数字]的顺序返回。题目给出的约束与示例与 LeetCode 题目保持一致$2 \le nums.length \le 10^{4}$$1 \le nums[i] \le 10^{4}$示例 1nums [1,2,2,4]输出[2,3]2 重复、3 丢失示例 2nums [1,1]输出[1,2]1 重复、2 丢失。关键前提是数组中恰好只存在一个重复数字与一个丢失数字这一前提是所有解法的逻辑基础。本仓库在 00_preface/00_06_categories_list.md 中将该题归入「位运算、数组、哈希表、排序」标签下文将围绕其中最容易上手的两种经典思路展开。思路 1哈希表统计频率最直观的做法是借助哈希表记录每个数字出现的次数然后扫描 $1$ 到 $n$ 即可同时定位重复与丢失。算法步骤使用哈希表freq记录数组中每个数字出现的次数遍历 $i$ 从 $1$ 到 $n$若freq[i] 2说明 $i$ 是重复的数字若freq[i] 0说明 $i$ 是丢失的数字返回[duplicate, missing]。由于数组中只有唯一一个数字出现两次、唯一一个数字未出现因此上述两个条件各命中一次逻辑上不会冲突。参考代码原题解中的完整实现如下class Solution: def findErrorNums(self, nums: List[int]) - List[int]: from collections import Counter n len(nums) freq Counter(nums) duplicate, missing 0, 0 for i in range(1, n 1): if freq[i] 2: duplicate i elif freq[i] 0: missing i return [duplicate, missing]实现要点说明使用collections.Counter(nums)一次性完成频率统计统计后freq[i]默认返回0未出现过的键因此freq[i] 0的判断可以安全命中丢失数字若不想依赖Counter也可手写freq {}并遍历nums累加或使用长度为 $n 1$ 的普通数组作为计数表效果等价本仓库 0268. 丢失的数字 的思路 1 也采用了同一「哈希表 范围扫描」模式可以对照阅读体会该范式在「找缺失」类题目中的通用性。复杂度分析时间复杂度$O(n)$。统计频率遍历数组一次 $O(n)$扫描 $1$ 到 $n$ 一次 $O(n)$合计 $O(n)$空间复杂度$O(n)$。哈希表最多存储 $n$ 个键值对。思路 2数学方法和 平方和联立方程哈希表思路直观但空间开销为 $O(n)$。若能接受纯数学推导则可在 $O(1)$ 空间内求解适合对空间有要求的场景。推导过程设重复的数字为 $x$丢失的数字为 $y$。定义$sum_nums$数组 $nums$ 的元素和$sum_n$$1 2 \cdots n \dfrac{n(n1)}{2}$$sum_sq_nums$数组元素的平方和$sum_sq_n$$1^2 2^2 \cdots n^2 \dfrac{n(n1)(2n1)}{6}$。由于数组中 $y$ 被 $x$ 替换可以建立两个方程一次方程$sum_nums - sum_n x - y$二次方程$sum_sq_nums - sum_sq_n x^2 - y^2 (x y)(x - y)$。令diff sum_nums - sum_n则由两式相除可得$$x y \frac{sum_sq_nums - sum_sq_n}{diff}$$联立一次方程最终解得$$x \frac{diff (x y)}{2}, \qquad y (x y) - x$$参考代码class Solution: def findErrorNums(self, nums: List[int]) - List[int]: n len(nums) # 计算数组的和与平方和 sum_nums sum(nums) sum_sq_nums sum(x * x for x in nums) # 计算 1 到 n 的和与平方和 sum_n n * (n 1) // 2 sum_sq_n n * (n 1) * (2 * n 1) // 6 # x - y sum_nums - sum_n diff sum_nums - sum_n # x^2 - y^2 sum_sq_nums - sum_sq_n # (x y)(x - y) sum_sq_nums - sum_sq_n # x y (sum_sq_nums - sum_sq_n) / (x - y) sum_xy (sum_sq_nums - sum_sq_n) // diff # 求解 x 和 y duplicate (diff sum_xy) // 2 missing sum_xy - duplicate return [duplicate, missing]边界与细节验证用示例 1 手动验证nums [1,2,2,4]$n 4$$sum_nums 9$$sum_sq_nums 14416 25$$sum_n 10$$sum_sq_n 30$。于是diff -1sum_xy (25 - 30) // (-1) 5duplicate (-1 5) // 2 2missing 5 - 2 3输出[2, 3]正确。几个需要留意的实现细节diff不会为 0因为 $x \ne y$重复数与丢失数不可能相同所以 $x - y diff \ne 0$除法安全但若题目描述改为允许其他异常形态则需额外判零负数的整除diff可能为负数如示例 1Python 中//对负数的整除结果仍能保证(x y)(x - y) // (x - y) x y的代数关系成立这是该实现可直接使用//的原因整数溢出$n$ 最大为 $10^{4}$平方和上限约为 $\frac{10^{4} \times 10^{4} \times 2 \times 10^{4}}{6} \approx 3.3 \times 10^{11}$Python 整数无上限无需担心但若用 C/C/Java 等固定位宽语言实现sum_sq需要选用long longC/C或longJava等足够宽的整数类型这是该思路在工程实现中的常见坑点。复杂度分析时间复杂度$O(n)$。仅需遍历数组一次计算和与平方和空间复杂度$O(1)$。只使用了常数级别的额外空间。两思路对比与选型建议解法时间复杂度空间复杂度核心思想适用场景哈希表Counter$O(n)$$O(n)$频率统计 范围扫描思路直观、代码易读适合作为首选写法数学方法和 平方和$O(n)$$O(1)$建立两个方程联立求解对空间敏感、面试中体现推导能力的进阶写法两者时间复杂度相同差异仅在空间常数与代码可读性上。实际刷题或面试时建议先给出哈希表解法保证正确性再补充数学解法的推导过程展示思路深度若被追问「能否不用额外空间」数学方法即为标准答案。扩展从本仓库看同类题目的解题脉络该题与本仓库其他题解构成清晰的「找缺失 / 找重复」知识链建议串读0268. 丢失的数字单一缺失场景同样给出「哈希表」与「数学求和」两种思路其中求和法正是本题思路 2 的一元简化版0287. 寻找重复数单一重复场景给出二分查找解法可对比「仅找重复」与「重复 缺失」问题的不同切入点07_algorithm/07_06_bit_operation.md系统讲解按位与、按位或、按位异或等基础位运算。本题标签包含「位运算」经典做法是把数组全部元素与 $1$ 到 $n$ 全部异或得到 $x \oplus y$再按最低不同位分组异或解出 $x$、$y$可在掌握位运算基础后自行推导实现作为第三种 $O(1)$ 空间的补充练习。此外该题在仓库中的位置为 docs/solutions/0600-0699/set-mismatch.md对应章节索引见 docs/solutions/0600-0699/index.md全量题目清单见 00_preface/00_05_solutions_list.md便于按编号索引检索。小结本题虽标注「简单」却同时覆盖了哈希表、数学推导、位运算三类高频算法思想是练习「数组 数学」类问题的高性价比题目。核心要点可归纳为哈希表思路靠「出现次数为 2 / 0」一箭双雕地定位重复与缺失代码最稳数学思路通过一次方程与二次方程联立求解 $x$、$y$空间最优但需注意整除符号与溢出问题三类标签位运算、数组、哈希表、排序对应至少四种可行解法掌握任意两种即可从容应对面试追问。赞分享教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载相关推荐LeetCode-Go 题解精讲645. Set Mismatch集合错位计数数组解法LeetCode Go 题解精讲645. Set Mismatch集合错位计数数组解法 导读 本文基于 LeetCode Go https://link.示例工程codeforces-go 题解剖析力扣双周赛 176 Q2「前缀连通组」哈希表计数解法codeforces go 题解剖析力扣双周赛 176 Q2「前缀连通组」哈希表计数解法 导读 本题是力扣双周赛 176 的第二题Number of Pre科学计算codeforces-go 仓库实战力扣双周赛 165 Q1 最小缺席正整数——下界枚举 哈希集合的 O(n) 解法codeforces go 仓库实战力扣双周赛 165 Q1 最小缺席正整数——下界枚举 哈希集合的 O n 解法 本篇技术指南以算法竞赛模板库 co科学计算上一篇OpenTracks核心功能详解从轨迹记录到数据统计的完整攻略下一篇Voyager会话存储优化提升并发用户访问体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

TRAE 无法切换运行 conda 创建的环境:把 settings 改到 TaoToken 后排查 run 运行方式

TRAE 无法切换运行 conda 创建的环境:把 settings 改到 TaoToken 后排查 run 运行方式

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

2026/10/9 1:40:09 阅读更多 →
降AIGC黑科技揭秘!全网实测榜单与智能选型宝典:TaoToken统一Key接入实测

降AIGC黑科技揭秘!全网实测榜单与智能选型宝典:TaoToken统一Key接入实测

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

2026/10/9 1:40:08 阅读更多 →
猫抓资源嗅探扩展:3 步完成网页视频音频下载的完整指南

猫抓资源嗅探扩展:3 步完成网页视频音频下载的完整指南

猫抓资源嗅探扩展:3 步完成网页视频音频下载的完整指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 整理在线课程时,我想…

2026/10/9 1:40:08 阅读更多 →

最新新闻

开源多模态视频模型 MiniMax H3 部署与推理优化实践

开源多模态视频模型 MiniMax H3 部署与推理优化实践

搞视频AI的人大概都有一个共同的痛点:生成一段视频要抽帧、分析画面、转换文本、对齐音频、再加字幕,每一步都要接不同的模型,管线长到怀疑人生。上个月我在处理一个内部需求时,把开源多模态视频模型 MiniMax H3 视频工作室整套流…

2026/10/9 7:32:10 阅读更多 →
ReAct模式详解:从零实现AI Agent的推理与行动循环

ReAct模式详解:从零实现AI Agent的推理与行动循环

先别急着写代码。做 AI Agent,尤其是基于大语言模型做那种能“自己拿主意”的智能体,你绕不开一个最基础也最核心的套路:ReAct 模式。我最早接触这个概念的时候,也觉得不就是一个“推理再行动”的循环循环吗?但真正动手…

2026/10/9 7:32:10 阅读更多 →
Android DPMS学习之一——setLockTaskPackages

Android DPMS学习之一——setLockTaskPackages

今日工作中,涉及到了对LockTask模式相关方法的答疑,故此,整理一个学习记录。 void setLockTaskPackages (ComponentName admin, String[] packages) 这个方法的根本目的,是指定哪些应用程序包(Package)被允…

2026/10/9 7:32:10 阅读更多 →
FDE前线部署工程:私有化AI落地的最后一公里

FDE前线部署工程:私有化AI落地的最后一公里

1. 项目概述:FDE 不是“把模型拷过去就完事”的搬运工“FDE”这三个字母最近在多个技术团队的周会纪要里高频出现,但翻遍主流文档,你很难找到一个权威定义——它既不是某个开源框架的缩写,也不是某家大厂新推的认证体系。FDE&…

2026/10/9 7:32:10 阅读更多 →
半透反LCD 2D仿真实战:TechWiz建模关键与排障

半透反LCD 2D仿真实战:TechWiz建模关键与排障

最近在帮朋友追一个户外可穿戴屏项目,客户开口就是“强光下要看得清”。常规方案里,半透反射式(Transflective)LCD是最合适的路线,这也是我常说的“ Display 既要背光透射又要环境光反射”的双模式面板。但问题在于&am…

2026/10/9 7:32:10 阅读更多 →
编写恰到好处的产品退市(EOL)通知:Product-Manager-Skills 的 eol-message 技能实战指南

编写恰到好处的产品退市(EOL)通知:Product-Manager-Skills 的 eol-message 技能实战指南

AI 技能AI 插件 【免费下载链接】Product-Manager-Skills Product Management skills framework built on battle-tested methods for Claude Code, Cowork, Codex, and AI agents. 项目地址: https://gitcode.com/gh_mirrors/pr/Product-Manager-Skills 点击查看 免…

2026/10/9 7:31:10 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/9 6:17:20 阅读更多 →