news 2026/10/27 18:23:49

哈希表算法实战:从基础到LeetCode经典题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
哈希表算法实战:从基础到LeetCode经典题解

1. 哈希表算法复健:从基础到实战

今天咱们聊聊哈希表这个数据结构在算法题中的应用。作为算法工程师日常必备技能,哈希表能高效解决很多看似复杂的问题。我挑选了LeetCode上4道经典题目(242、349、202、1),通过它们带你彻底掌握哈希表的应用场景和实现技巧。

哈希表本质上是通过哈希函数将键映射到存储位置的数据结构,平均情况下能实现O(1)时间复杂度的查找操作。在实际算法题中,它特别适合处理需要快速判断元素是否存在、统计元素出现次数这类需求。下面我会结合具体题目,展示如何用哈希表优雅解题。

2. LC 242. 有效的字母异位词

2.1 问题重述

给定两个字符串s和t,判断t是否是s的字母异位词(即字母相同但排列不同)。例如:

输入: s = "anagram", t = "nagaram" 输出: true

2.2 哈希表解法

最直接的思路是用哈希表统计每个字母出现的次数:

def isAnagram(s: str, t: str) -> bool: if len(s) != len(t): return False count = {} for char in s: count[char] = count.get(char, 0) + 1 for char in t: if char not in count or count[char] == 0: return False count[char] -= 1 return True

2.3 优化技巧

对于仅包含小写字母的情况,可以用固定大小的数组代替哈希表:

def isAnagram(s: str, t: str) -> bool: if len(s) != len(t): return False count = [0] * 26 for char in s: count[ord(char) - ord('a')] += 1 for char in t: count[ord(char) - ord('a')] -= 1 if count[ord(char) - ord('a')] < 0: return False return True

注意:使用数组时要注意字符范围,如果可能包含Unicode字符,还是应该用哈希表

3. LC 349. 两个数组的交集

3.1 问题描述

给定两个数组nums1和nums2,返回它们的交集。输出结果中的每个元素必须是唯一的。

示例:

输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]

3.2 哈希集合解法

使用集合可以自动去重:

def intersection(nums1, nums2): set1 = set(nums1) set2 = set(nums2) return list(set1 & set2)

3.3 进阶思考

如果内存有限,可以只将一个数组转为集合:

def intersection(nums1, nums2): set1 = set(nums1) res = [] for num in nums2: if num in set1: res.append(num) set1.remove(num) # 避免重复添加 return res

4. LC 202. 快乐数

4.1 问题定义

快乐数定义为:对于一个正整数,每次将该数替换为它每个位置上的数字的平方和,重复这个过程直到结果为1(此时就是快乐数),或者无限循环但始终变不到1。

示例:

输入:19 输出:true 解释: 1² + 9² = 82 8² + 2² = 68 6² + 8² = 100 1² + 0² + 0² = 1

4.2 哈希表检测循环

关键点在于如何检测循环,可以用哈希表记录出现过的数字:

def isHappy(n: int) -> bool: seen = set() while n != 1: if n in seen: return False seen.add(n) n = sum(int(d)**2 for d in str(n)) return True

4.3 数学优化

实际上可以不用哈希表,用快慢指针法检测循环:

def isHappy(n: int) -> bool: def get_next(number): return sum(int(d)**2 for d in str(number)) slow = n fast = get_next(n) while fast != 1 and slow != fast: slow = get_next(slow) fast = get_next(get_next(fast)) return fast == 1

5. LC 1. 两数之和

5.1 经典问题

给定一个整数数组nums和一个整数目标值target,找出和为目标值的那两个整数,并返回它们的数组下标。

示例:

输入:nums = [2,7,11,15], target = 9 输出:[0,1]

5.2 哈希表解法

暴力解法是O(n²),用哈希表可以优化到O(n):

def twoSum(nums, target): num_map = {} for i, num in enumerate(nums): complement = target - num if complement in num_map: return [num_map[complement], i] num_map[num] = i return []

5.3 边界情况处理

实际编码时要注意:

  1. 数组中可能有重复元素
  2. 确保不重复使用同一个元素
  3. 确保有解(题目保证有解时可以忽略)

6. 哈希表实战技巧总结

6.1 选择合适的数据结构

  • Python中常用dict和set
  • 对于固定范围的小整数,可以用数组代替
  • Java中HashMap和HashSet
  • C++中unordered_map和unordered_set

6.2 常见应用场景

  1. 快速查找元素是否存在
  2. 统计元素出现频率
  3. 记录元素位置或状态
  4. 检测循环或重复

6.3 性能优化要点

  • 预估数据规模,初始化合适容量
  • 考虑哈希冲突的影响
  • 在时间和空间之间权衡
  • 利用语言特性(如Python的集合操作)

7. 高频面试问题解析

7.1 哈希表底层实现原理

大多数语言中的哈希表使用数组+链表/红黑树实现。当哈希冲突时,会在同一个桶中使用链表存储,当链表过长时可能转为红黑树提高查询效率。

7.2 哈希函数设计要点

好的哈希函数应该:

  1. 计算速度快
  2. 分布均匀
  3. 对相似输入产生不同哈希值

7.3 解决哈希冲突的方法

  1. 链地址法(Java HashMap使用)
  2. 开放地址法
  3. 再哈希法

8. 扩展练习建议

想要真正掌握哈希表,建议继续练习:

  • LC 205 同构字符串
  • LC 290 单词模式
  • LC 451 根据字符出现频率排序
  • LC 347 前K个高频元素

我在刷题过程中发现,很多中等难度题目都是哈希表和其他数据结构(如堆、双指针)的结合。建议先掌握这些基础题,再挑战更复杂的组合题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 18:23:46

Ponytail:面向AI Agent的可编程运行时框架与工程化实践

1. 项目概述&#xff1a;Ponytail 是什么&#xff0c;它解决的到底是什么问题&#xff1f;Ponytail 这个名字乍一听像某种发型&#xff0c;但在当前 AI 工具链生态里&#xff0c;它正快速成为一个高频出现的代号——不是 UI 界面&#xff0c;不是 SaaS 平台&#xff0c;而是一个…

作者头像 李华
网站建设 2026/10/27 18:23:26

my-tv 免费安卓电视直播软件:三分钟装好开播,遥控器直接换台

my-tv 免费安卓电视直播软件&#xff1a;三分钟装好开播&#xff0c;遥控器直接换台 【免费下载链接】my-tv 我的电视 电视直播软件&#xff0c;安装即可使用 项目地址: https://gitcode.com/GitHub_Trending/my/my-tv my-tv 是一款免费电视软件&#xff0c;主打安卓电视…

作者头像 李华
网站建设 2026/10/27 18:16:48

Hadoop监控模板:原生JMX/Prometheus/REST三源适配方案

简介&#xff1a;本资源是一套专为Hadoop生态监控设计的Grafana可视化模板集合&#xff0c;面向大数据运维工程师、平台开发人员及系统管理员&#xff0c;解决Hadoop集群多组件&#xff08;HDFS/YARN/HBase/Hive/Kafka/Spark/ZooKeeper&#xff09;指标分散、难以统一观测的痛点…

作者头像 李华
网站建设 2026/10/27 18:16:44

副队长JavaScript教程(36)-函数:经验的复用体

点此查看 所有教程、项目、源码导航 文章目录1. 经验2. 程序世界的经验3. 代码块的应用4. 只用代码块存在的问题5. 函数&#xff1a;用来复用经验的载体6. 我们先推断函数的样子7. 小结1. 经验 在成长的过程中&#xff0c;我们会不断积累经验&#xff0c;遇到相似的事情&#…

作者头像 李华
网站建设 2026/10/27 18:13:04

多模态情感分析实战:BERT+ResNet与五种特征融合方法详解

简介&#xff1a;针对Python期末大作业与课程设计中常见的多模态情感分析任务&#xff0c;这份资源提供了基于BERTResNet的完整可运行方案。项目依托Hugging Face与torchvision实现&#xff0c;在Models文件夹下集成了五种融合方法&#xff0c;包括两种Naive拼接策略与三种注意…

作者头像 李华
网站建设 2026/10/27 18:11:53

SystemVerilog事件驱动仿真:混合信号验证中DFE与拉普拉斯域建模实践

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

作者头像 李华