- 哈希表(Hash Table):
- · 哈希表是根据关键码的值而直接进行访问的数据结构。
- · 用来快速判断一个元素是否出现集合里(只需要 O(1))。
- 哈希函数(Hash Function):
- · 哈希函数:将值映射到哈希表的索引
- · hashCode 先将想要储存的值(如字符串)转化为数值,(一般hashcode是通过特定编码方式,可以将其他数据格式转化为不同的数值。)
- · hashCode 给出的值有可能大于哈希表长度,取模即可。hashCode(name) % tableSize
- 哈希碰撞(Collisions):
- · 哈希碰撞:两个值映射到了同一位置
- · 拉链法:在对应位置将发生冲突的元素都被存储在链表中
- · 线性探索法:若发生碰撞,则向下找一个空位放置(使用线性探测法,一定要保证tableSize大于dataSize)
- 常见的哈希结构:
- · 数组
- · set (集合)
- · map(映射)
在做面试题目的时候遇到需要判断一个元素是否出现过的场景应该第一时间想到哈希法
242.有效的字母异位词
题目链接/文章讲解/视频讲解: 代码随想录
暴力双循环:
两层 for 循环,同时还要检查字符是否重复出现,时间复杂度 。
哈希法:
本题的关键是判断两个字符串里的元素的出现次数是否相同,原理是判断一个元素是否曾出现过,因此考虑哈希法。
因为字符串中只可能包含26个小写字母,可以直接定义一个数组(哈希表数据结构之一),index 来表示字母(的 ASCII 值),value 用来描述该字母出现的次数。
首先遍历 s,将 s 里每一个字母出现的次数记录在哈希表中,然后再遍历 t,检查每个元素是否在哈希表里,以及出现的次数是否满足要求。
时间复杂度 O(n),空间复杂度 O(1)。
349. 两个数组的交集
题目链接/文章讲解/视频讲解:代码随想录
暴力双循环:
时间复杂度:。
哈希法:
跟上一道题类似,本质还是找某个元素是否出现过,以及记录元素出现的次数,因此考虑哈希。首先遍历 nums1,用字典(哈希表中的 hashmap 结构)来记录元素出现的次数(上一道题中与此对应的是用数组来记录元素出现的次数),然后遍历 nums2,判断元素是否在 hashmap 中。
时间复杂度 O(m + n),空间复杂度 O(n)。
202. 快乐数
题目链接/文章讲解:代码随想录
只需要将每次的“位置数字平方和”记录下来,然后判定下一个平方和是否已经出现过。判断元素是否出现过:考虑哈希。可以定义一个元组,将平方和储存在元组中。如果新的平方和已经出现在元组中,则证明已经开始循环,返回 False;如果新的平方和为 1,则返回 True;否则将新的平方和加入元组中。
1. 两数之和
题目链接/文章讲解/视频讲解:代码随想录
暴力双循环:
时间复杂度 。
哈希法:
本题的关键在于,给定一个数,去查找是否有另一个数使得两数之和满足要求。在暴力双循环中,我们用遍历的形式来查找另一个数。查找某个元素是否出现:想到哈希法。创建一个哈希表,格式为 hashmap(python里为字典),key 表示元素,value 表示元素下标。遍历列表,对于每一个元素 x,查询哈希表中是否存在 target - x,然后将 x 存放进哈希表中。
时间复杂度 O(n),空间复杂度 O(n)。