代码随想录算法训练营Day6 | 哈希表 Part 1

一、今日学习目标

掌握哈希表的核心理论(哈希函数、哈希碰撞及解决方法),理解数组、set、map 三种哈希结构的适用场景,并通过「两个数组的交集」「快乐数」「两数之和」三道题目,实战掌握哈希表在快速查找、去重、键值映射等场景的应用。

二、核心理论知识

1、哈希表的数学本质

理论知识

哈希表是一种通过「关键码直接访问数据」的数据结构,其核心是哈希函数—— 将关键码(如数值、字符串)映射为哈希表的索引,实现 O (1) 级别的快速访问。从数学角度看,哈希函数可表示为:
index=hashFunction(key) mod tableSize

2、哈希碰撞与解决方法

当不同关键码映射到同一索引时,产生哈希碰撞,常见解决方法:

  • 拉链法:在碰撞索引处构建链表,存储所有冲突元素(如 Java 的 HashMap)。需合理设置tableSize,避免链表过长影响效率。
  • 线性探测法:当碰撞发生时,依次检查下一个索引(index+1, index+2...),要求tableSize > dataSize(数据量),确保有足够空位。

3、三种常见的哈希结构对比

结构底层实现使用场景
数组连续内存关键码范围小且连续
set红黑树、哈希表需去重且无需存储额外信息
map红黑树、哈希表需存储键值对

三、实战解题

1、有效的字母异位词

题目描述

LeetCode 242 有效的字母异位词

代码实现

文章讲解

Python代码
class Solution(object):def isAnagram(self, s, t):""":type s: str:type t: str:rtype: bool"""record = [0]*26for i in s:record[ord(i)-ord('a')] += 1for i in t:record[ord(i)-ord('a')] -= 1for i in range(26):if record[i] != 0:return  Falsereturn True
调试过程

通过调试发现,看似简单的计数逻辑,需重点关注输入合法性(长度、字符范围)和效率优化(提前终止),这也是哈希表类问题的通用调试要点 —— 既要保证逻辑正确,也要兼顾边界场景和性能。

2、两个数组的交集

题目描述

LeetCode 349 两个数组的交集

代码实现

文章讲解

Python代码
class Solution(object):def intersection(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: List[int]"""table = {}for num in nums1:table[num] = table.get(num, 0)+1res = set()for num in nums2:if num in table:res.add(num)del table[num]return list(res)
调试过程

最初尝试用列表存储结果,未考虑去重,导致输出包含重复元素(如示例中 nums2 的两个 4)。改用 set 存储结果后,自动去重问题解决。

3、快乐数

题目描述

LeetCode 202 快乐数

代码实现

文章讲解

Python代码
class Solution(object):def isHappy(self, n):""":type n: int:rtype: bool"""seen = []while n != 1:n = sum(int(i)**2 for i in str(n))if n in seen:return Falseseen.append(n)return True
调试过程

最初忽略了「无限循环」的本质,未用 set 记录中间结果,导致程序陷入死循环。加入 set 后,当检测到重复的 n 时,可直接判断为非快乐数。

4、两数之和

题目描述

LeetCode 1 两数之和

代码实现

文章讲解

Python代码
class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""records = dict()for index, value in enumerate(nums):if target - value in records:return [records[target - value], index]records[value] = indexreturn []
调试过程

通过调试发现,该解法的关键在于哈希表存储元素与索引的映射,并利用遍历顺序确保重复元素的索引正确性。需注意的边界条件包括:

  1. 重复元素:哈希表覆盖索引的行为因遍历顺序而不影响结果;

  2. 无解情况:需确保代码返回空列表而非报错;

  3. 特殊数值:负数、零等需验证哈希表查询逻辑。

四、易错点总结

题目易错点

解决方法

两个数组的交集结果未去重;用数组导致空间浪费用 set 存储结果;数值范围不确定时优先用 set
快乐数未检测循环导致死循环;求和时漏处理个位用 set 记录中间结果;用 divmod 统一处理各位
两数之和用 set 无法存储下标;忽略元素重复情况用 map 存储键值对;依赖遍历顺序避免重复使用

五、扩展思考

1.** 哈希函数设计 :好的哈希函数应尽量减少碰撞,可结合数论中的「素数取模」(如 HashMap 的容量为 2ⁿ,减少碰撞概率)。
2.
 时间复杂度对比 **:

  • 数组:查询 O (1),但空间复杂度 O (M)(M 为最大可能值);

  • unordered_set/map:查询 O (1)(平均),空间 O (n),适合大数据量;

  • set/map(红黑树):查询 O (logn),但有序,适合需排序的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916483.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5.13.树、森林与二叉树的转换

当使用"孩子兄弟表示法"存储树或森林时,最终会呈现出与二叉树类似的形态,所以树、森林与二叉树之间的转换本质上就是画出采用孩子兄弟表示法存储的树和森林。一."树->二叉树"的转换:1.例一:以上述图片左边…

Spring 核心流程

Spring 核心流程前言一、AbstractApplicationContext#refresh 方法解析1.1 前置1.2 refresh 方法1.2.1 prepareRefresh1.2.2 obtainFreshBeanFactory1.2.3 prepareBeanFactory1.2.4 postProcessBeanFactory1.2.5 invokeBeanFactoryPostProcessors1.2.6 registerBeanPostProcess…

RS485转Profinet网关与JRT激光测距传感器在S7-1200 PLC系统中的技术解析与应用

RS485转Profinet网关与JRT激光测距传感器在S7-1200 PLC系统中的技术解析与应用技术核心:协议转换与数据桥梁在工业自动化系统中,RS485转Profinet网关承担着协议翻译官的角色。以XD-MDPN100型号为例,其本质是将RS485设备的串口数据封装为Profi…

《C++ string 完全指南:string的模拟实现》

string的模拟实现 文章目录string的模拟实现一、浅拷贝和深拷贝1.浅拷贝2.深拷贝3.写时拷贝二、定义string的成员变量三、string的接口实现1.string的默认成员函数(1)构造函数实现(2)析构函数实现(3)拷贝构…

造成服务器内存不足的原因有什么

服务器在日常的运行过程中,会存储大量关于企业重要的数据信息,偶尔会出现内存飙升空间不足的情况,服务器内存作为服务器数据处理和存储的主要空间,异常占用会导致服务器性能降低,影响到企业业务的响应速度,…

JVM、Dalvik、ART垃圾回收机制

一、JVM垃圾回收机制(桌面/服务器端)1. 核心算法:分代收集新生代回收(Minor GC)触发条件:Eden区满时触发算法:复制算法(Eden → Survivor区)过程:存活对象在S…

数学专业转型数据分析竞争力发展报告

一、核心优势拆解(1)数学能力与数据分析对应关系数学课程数据分析应用场景比较优势说明概率论假设检验设计能准确判断统计显著性阈值实变函数数据质量评估异常值检测的严格性更高线性代数特征工程构建矩阵运算优化模型训练效率(2)…

JAVA进阶--MySQL

一.MySQL架构连接层:处理客户端连接服务,认证授权相关的操作服务层:最核心的一层(核心服务功能),处理sql,包括sql优化,函数调用....存储引擎层:存储引擎是真正负责来操作数据的(mysql中数据的存储和提取), mysql中有不同存储引擎,…

【架构】Docker简单认知构建

作为一个之前从来没有接触过Docker的倒霉蛋,想了解学习一下Docker 搜了CSDN和RUNOOB,得到的描述如下: Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包…

C++ std::list概念与使用案例

C std::list 概念详解 std::list 是 C 标准模板库(STL)中的一个双向链表容器。与 vector 和 array 不同,它不保证元素在内存中连续存储,而是通过指针将各个元素连接起来。 核心特性 双向链表结构: 每个元素包含指向前驱…

从0到1学Pandas(六):Pandas 与数据库交互

目录一、数据库基础操作1.1 连接数据库1.2 执行 SQL 查询1.3 创建与修改表结构二、数据导入导出2.1 从数据库读取数据2.2 将数据写入数据库2.3 大数据量处理三、数据库事务处理3.1 事务概念与实现3.2 批量数据更新3.3 错误处理与回滚四、数据库性能优化4.1 查询性能优化4.2 连接…

GitHub 趋势日报 (2025年07月26日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图602Qwen3-Coder573neko527hrms275BillionMail153Win11Debloat115hyperswitch57data…

机器人仿真(2)Ubuntu24.04下RTX5090配置IsaacSim与IsaacLab

目录 一、前言二、电脑配置三、配置步骤3.1 创建Conda环境3.2 安装PyTorch3.3 安装Isaac Sim3.4 安装Isaac Lab 四、总结 一、前言 博主自从去年开始就一直在关注Isaac Lab和Isaac Sim,但是一直以来由于手头设备只有4060,甚至没有达到最低配置16GB显存要…

DaVinci Resolve 19.0(达芬奇)软件安装包下载及详细安装教程|附带安装文件

[软件名称]:ArcGIS [软件大小]:2.99 GB [系统要求]:支持Win7及更高版本 [下载通道]: 迅雷网盘 [下载链接]:高速下载地址 https://pan.xunlei.com/s/VOW9nw-JV99A_7f_5hhpgqO2A1?pwdbufh# ⚠️:先用手机下载迅雷网盘保存到手机中&#xff0c…

Java学习第八十一部分——Shiro

目录 📫 一、前言提要简介 🛡️ 二、核心功能介绍 ⚙️ 三、核心架构组件 ☕ 四、与Java的关系 ⚖️ 五、与Spring Security对比 🧩 六、典型应用场景 💎 七、总结归纳概述 📫 一、前言提要简介 Apache Shiro 是…

虚拟机ubuntu20.04共享安装文件夹

ubuntu20.04共享安装文件夹 4.5 共享安装文件夹 将Windows存放安装文件的文件夹共享给虚拟机,如下图操作:如果是在ubuntu20.04中,还需要以下的操作: sudo mkdir /mnt/hgfs 此命令无效 sudo echo ‘vmhgfs-fuse /mnt/hgfs fu…

如何查看电脑后门IP和流量?

你是否也有以下经历?深夜,你的电脑风扇突然狂转,屏幕却一片寂静;每月流量莫名超标,账单高得离谱;鼠标偶尔不听使唤…这些可能不是电脑“闹脾气”,如何一探究竟? 想象一下&#xff1a…

分类预测 | MATLAB基于四种先进的优化策略改进蜣螂优化算法(IDBO)的SVM多分类预测

分类预测 | MATLAB基于四种先进的优化策略改进蜣螂优化算法(IDBO)的SVM多分类预测 目录分类预测 | MATLAB基于四种先进的优化策略改进蜣螂优化算法(IDBO)的SVM多分类预测分类效果基本介绍多策略量子自适应螺旋搜索算法研究摘要1. 引言1.1 研究背景1.2 研究意义1.3 研究目标2. 文…

Android 修改系统时间源码阅读

链接:XRefAndroid - Support Android 16.0 & OpenHarmony 5.0 (AndroidXRef/AospXRef) 这里看的Android 10的代码,选中Android 10,勾选所有工程,搜索DateTimeSettings‌: 看到showTimePicker应该是显示一个设置时…

关于自定义域和 GitHub Pages(Windows)

GitHub Pages 支持使用自定义域,或将站点 URL 的根目录从默认值(例如 )更改为您拥有的任何域,比如octocat.github.io。 谁可以使用此功能? GitHub Pages 在公共存储库中提供 GitHub Free 和 GitHub Free for organizations,在公共和私有存储库中提供 GitHub Pro、GitHub …