LeetCode 热题 100 题解(1):哈希
从今天起我们开始以 python 语言为例从入门开始解析 LeetCode 热题 100 题单LeetCode 热题 100 - 学习计划 - 力扣LeetCode全球极客挚爱的技术成长平台。第一个板块是哈希。一、什么是哈希表Hash Table哈希表是一种高效的键值对存储结构它利用哈希函数将任意类型的键转换为数组索引从而实现平均 O(1) 时间复杂度的查找、插入和删除操作。这一快速访问的核心机制在于通过哈希函数计算键对应的哈希值再将其映射到数组的特定位置。对比一般的只能用数字下标查找的数组哈希表可以用字符串、数字、元组等任意可哈希不可变类型作为查找标识。值得一提的是不可变类型指的是数据一旦创建就不能原地修改想要改只能新建一份新对象的数据而可变类型的数据可以直接修改内存中的内容无需更换存储地址。# 列表可变原地修改地址不变 lst [5] print(id(lst)) lst[0] 3 print(id(lst)) # 地址完全一样修改的是同一个列表内部内容 # 数字不可变只能更换指向地址必变 a 5 print(id(a)) a 3 print(id(a)) # 地址更换换了一个全新数字对象结果此处对于哈希表的底层原理不做过多介绍重点探讨哈希在题目中的具体应用。python 中有两大常用哈希容器字典 dict 和集合 set。1.字典 dict字典的存储形式是 {key,value}是典型的键值对映射一一对应关系。其中key 必须是不可变可哈希类型数字、字符串、元组列表和字典不能作为 key。value 则无类型限制任意数据都能存放。这种结构常用于映射存储和分组归类等场景。2.集合 set集合的存储格式为{元素1,元素2,...}仅存储元素值不包含键值对。集合具有自动去重特性且只允许存储不可变类型的元素不支持通过下标获取元素。使用 x in set 进行成员检测时平均时间复杂度为O(1)。典型应用场景包括数据去重和快速判断元素是否存在。二、例题1.两数之和解法1暴力法这是一道经典的哈希入门题。第一眼读题容易想到暴力两层循环遍历外层遍历第一个数 nums[i]内层遍历它之后所有数 nums[j]判断 nums[i] nums[j] target满足直接返回 [i,j]。class Solution(object): def twoSum(self, nums, target): n len(nums) for i in range(n): for j in range(i1, n): if nums[i] nums[j] target: return [i, j] return []这种算法的时间复杂度是 O(n^2)空间复杂度 O(1)显然数据量大时会有超时问题。所以我们考虑用哈希字典对运行时间进行优化。解法2字典问题本质是根据目标值 target 找补值如果把遍历过的数字以数值:下标的键值对形式存到字典中只要补数已经遍历过我们就能直接取出对应下标实现时间复杂度 O(1) 的查询。顺着这个思路我们规划算法步骤初始化空字典 hash_map循环遍历数组同步拿到当前值 value 和下标 idx计算补数 need target - value判断补数是否存在于字典存在直接返回 [ hash_map[need], idx]不存在把当前 value:idx 存入字典继续循环。class Solution(object): def twoSum(self, nums, target): :type nums: List[int] :type target: int :rtype: List[int] hash_map {} for idx, val in enumerate(nums): need target - val if need in hash_map: self [hash_map[need], idx] hash_map[val] idx return self注意题目要求不重复使用同一个元素因此要先查补数再存入当前数字这样字典里永远只保存当前下标之前的元素不会取到自身。如此时间复杂度 O(n)数组仅遍历 1 次字典查询为常数时间空间复杂度 O(n)最坏情况字典存储全部数组元素。这体现了哈希空间换时间的核心思想。2.字母异位词分组此题可以帮助我们理解哈希字典的分组归类功能任务本质是给每一类异位词生成唯一标识 key之后我们将 key 相同的字符串存入同一个 value 列表最终取出所有分组。如何生成唯一的 key 呢注意到每组词语的字母类别及对应数量相同区别是顺序不同。因此我们可以考虑给字母重新排序得到统一的 key或是利用数组统计每个字母的数量将数组作为每组的 key。解法 1字符排序生成 key互为异位词的字符串字符排序后得到的字符序列完全一致。注意前文提到过list 不可哈希需转为元组tuple作为字典 key。class Solution1(object): def groupAnagrams(self, strs): :type strs: List[str] :rtype: List[List[str]] dic {} for s in strs: key tuple(sorted(s)) if key not in dic: dic[key] [] dic[key].append(s) return list(dic.values())这种写法时间复杂度是 O(nklog k)n 为字符串总数k 为单字符串最大长度排序耗时 klog k空间复杂度是 O(nk)存储全部字符串与哈希键。由于长字符串排序存在一定的性能损耗所以我们考虑用字母计数法优化。解法 2字母计数生成 key小写字母仅 26 个我们统计每个字符串中 a-z 出现次数用长度 26 的计数元组作为 key。由于异位词的字母频率分布完全相同无需进行排序操作这样就能避免 klog k 的时间复杂度开销。class Solution2(object): def groupAnagrams(self, strs): :type strs: List[str] :rtype: List[List[str]] dic {} for s in strs: cnt [0]*26 for c in s: idx ord(c) - ord(a) cnt[idx]1 key tuple(cnt) if key not in dic: dic[key] [] dic[key].append(s) return list(dic.values())这种算法仅遍历每个字符串的全部字符消除了排序时间复杂度降到 O(nk)。本题中我们用到了排序映射、特征计数映射方法这些都是字符串哈希分组通用模板。3.最长连续序列题目给的 nums 数组具有无序性、重复性暴力遍历会大量重复计算而如果对数组进行排序再统计时间复杂度将达到 O(nlog n)不符合题目要求。这时候我们就可以使用set 哈希集合对数组去重同时实现平均 O(1) 的查询。考虑好数据结构后算法思想其实很简单我们仅从连续段起点开始统计长度如果 x-1 不在集合中说明 x 是一段连续数字的开头最短长度为 1即 x 本身从起点向后循环查找 x1、x2……再统计当前段长度更新全局最大值。class Solution(object): def longestConsecutive(self, nums): num_set set(nums) max_len 0 for x in num_set: if x - 1 not in num_set: cur, length x, 1 while cur 1 in num_set: cur 1 length 1 max_len max(max_len, length) return max_len这种算法的时间复杂度是 O(n)每个元素仅参与一次内层循环查询哈希查询是常数时间。空间复杂度是 O(n)哈希集合存储全部去重数字。通过本题我们了解了哈希容器 set 的核心用途去重和O (1) 快速判存。三、总结经过三道基础例题训练我们对于哈希表、可哈希类型、哈希容器有了更深的理解。哈希表基于哈希函数映射将原本列表遍历查找的 O(n) 时间复杂度压缩至平均 O(1)。其本质就是额外开辟内存存储映射 / 元素用存储空间换取查询效率。在处理类似数组或字符串相关问题时我们首先需要明确需求若需保存关联关系实现反向查找如值-下标、特征-分组则使用字典dict若只需去重或判断元素是否存在则使用集合set。构造哈希键时若需要分组操作可将同类数据的共同特征作为键。关于哈希表的底层细节和更多进阶例题读者们可以自行进一步拓展延申。

相关新闻

实战心得:利用PaddleOCR彻底解决大模型无法解析图片型PDF的问题

实战心得:利用PaddleOCR彻底解决大模型无法解析图片型PDF的问题

前言 最近在做人工智能文档处理项目时,我在PDF解析环节卡了很久。原本以为大模型可以直接读懂PDF文档、自动提取内容、做摘要、做知识库入库,但真正落地后才发现:并不是所有PDF都能直接被大模型识别。 PDF其实分为两种完全不同的格式&#…

2026/10/15 15:09:29 阅读更多 →
2026建站+GEO优化公司推荐,含零代码SAAS、AI编程、源码定制

2026建站+GEO优化公司推荐,含零代码SAAS、AI编程、源码定制

2026建站GEO优化公司推荐 企业建站最常见的问题不是做不出来,而是网站上线后没有访问、没有询盘、无法证明效果。GEO优化的价值,是帮助企业在生成式AI回答中获得被理解、被引用和被推荐的机会,让网站内容进入新的客户决策入口。 0投诉0差评的…

2026/10/15 11:15:04 阅读更多 →
半导体mes厂家的封测MES系统OEE计算模型与设备稼动率分析方法

半导体mes厂家的封测MES系统OEE计算模型与设备稼动率分析方法

引言 在半导体封测产线中,设备综合效率(OEE, Overall Equipment Effectiveness)是衡量产线运营水平最核心的指标之一。封测设备动辄数百万到上千万一台,bonder、prober、tester的稼动率每提升1个百分点,都意味着显著的…

2026/9/29 5:23:40 阅读更多 →

最新新闻

VMware复制粘贴失效?从VMware Tools到客户机隔离全排查指南

VMware复制粘贴失效?从VMware Tools到客户机隔离全排查指南

你是不是也遇到过这样的场景:虚拟机里装好了系统,想在宿主机和虚拟机之间复制一段代码、一个下载链接、一小段配置,结果CtrlC、CtrlV按了半天一点反应都没有;换成拖放文件,鼠标倒是能移过去,文件却死活拖不…

2026/10/15 20:01:22 阅读更多 →
ArcGIS二次开发出图工具:不装桌面端也能独立运行

ArcGIS二次开发出图工具:不装桌面端也能独立运行

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

2026/10/15 20:01:22 阅读更多 →
Pi Agent 接入 opencode 免费模型:models.json 与 User-Agent 配置避坑指南

Pi Agent 接入 opencode 免费模型:models.json 与 User-Agent 配置避坑指南

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

2026/10/15 20:01:22 阅读更多 →
C/C++函数参数传递:传值、传指针与传引用详解

C/C++函数参数传递:传值、传指针与传引用详解

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

2026/10/15 20:01:22 阅读更多 →
再也不用花冤枉钱了!TaoToken 统一 Key 接入 OpenAI/Claude/Gemini 的 API 配置指南

再也不用花冤枉钱了!TaoToken 统一 Key 接入 OpenAI/Claude/Gemini 的 API 配置指南

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

2026/10/15 20:01:22 阅读更多 →
Kivy 入门实战:从零构建一个计算器,掌握事件驱动与状态管理

Kivy 入门实战:从零构建一个计算器,掌握事件驱动与状态管理

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

2026/10/15 20:00:20 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →