目录
哈希表也叫散列表,用来快速判断一个元素是否出现集合里,把需要查询的内容映射为哈希表中的索引,牺牲空间换取时间
哈希碰撞解决方法:拉链法(存储在链表中);线性探测法(寻找其他合适的空位)
哈希结构:vector(数组), set(集合), map(映射)
底层实现:set/map & multiset/multimap 红黑树(平衡二叉搜索树,key值有序,不可修改,只能删除和增加);unordered_map/unordered_set 哈希表 (key无序,不可修改)
n数之和问题:满足条件的下标、所有满足条件的n元组、共有多少个满足条件的元组、是否存在满足条件的元组;解题方法:字典(和与出现次数的映射),双指针,三指针(固定1个指针,其他两个指针靠近)
具体见下面每题的解题思路,搞懂这些题,基本就掌握了哈希结构的运用
数组vector
大小有限,节约空间,一般用于字符串中字符的类型已知且固定(比如26个英文字母)
242 有效的字母异位词
- easy
- 题目描述
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
- 解题思路
用字典统计s中的每个字母及其对应出现的次数;遍历t,依次将每个字母从字典中抵消掉,如果t是s的字母异位词,那么最终字典所有value都是0,否则的话说明t不是s的字母异位词
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
# 用一个大小为26的数组记录s中所有字母出现的次数
ans = [0 for i in range(26)]
# 统计s
for i in range(len(s)):
idx = ord(s[i]) - ord('a')
ans[idx] += 1
# 抵消t
for i in range(len(t)):
idx = ord(t[i]) - ord('a')
ans[idx] -= 1
# ans中是否每一位都是0
for i in range(26):
if ans[i] != 0:
return False
return True
383 赎金信
- easy
- 题目描述
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
- 解题思路
和上面一题的思路一样,只不过根据题意,需要判断的是一个字符串是否能由另一个字符串构成,说明最终要判断的是字典中每个字母是否出现次数≥0,否则的话说明无法构成另一个字符串
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
# 和字母异位词类似,但是这题是包含关系,而不是相等关系
ans = [0 for i in range(26)]
# 统计magazine
for i in range(len(magazine)):
idx = ord(magazine[i]) - ord('a')
ans[idx] += 1
# 抵消ransomNote
for i in range(len(ransomNote)):
idx = ord(ransomNote[i]) - ord('a')
ans[idx] -= 1
# 判断是否ans每一项都大于等于0
for i in range(26):
if ans[i] < 0:
return False
return True
集合 set
349 两个数组的交集
- easy
- 题目描述
给定两个数组,编写一个函数来计算它们的交集。
- 解题思路
直接用python中自带的set()将list转换成集合,&表示求交集,最后转换返回值类型为list
class Solution:
def intersection(self, nums1: List[int], nums2: List[