哈希表理论
💡 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法
例如要查询一个名字是否在这所学校里。
要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。
我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。
主要是通过哈希函数进行映射。
哈希函数
哈希表本质是一个数组,哈希函数是将所需要的东西映射为索引,因此可以实现索引的直接读取。
哈希碰撞
拉链法
线性探测法
要求tablesize大于datasize,否则会放不下,其实就是往后接着找,一直找到有空位为止
常见的哈希结构
- 数组
- set(集合)
- map(映射)
哈希:牺牲了空间来换取时间
- 哈希表如何创建数组
242.有效的字母异位词
并不知道哈希表该怎么在代码中体现,先直接看了答案;dict也是可行的,注意defaultdict的用法
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
record = [0]*26 # 创建26个字母的哈希表
for i in range(len(s)):
# 记录s中每个字母出现的次数
record[ord(s[i]) - ord('a')] += 1 # 相对的位置
for i in range(len(t)):
# 减去在t中字母出现的次数
record[ord(t[i]) - ord('a')] -= 1
for i in range(26):
if record[i] != 0:
return False
return True
349. 两个数组的交集
感觉很简单,直接就做出来了
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
hash1, hash2 = [0]*1001 , [0]*1001
for element in nums1:
hash1[element] = 1
for element in nums2:
hash2[element] = 1
result = []
for i in range(1001):
if hash1[i] == 1 and hash2[i] == 1:
result.append(i)
return result
第202题. 快乐数
思路是对的,但是记住平方是**,不是 ^, 天大的教训😭
class Solution:
def isHappy(self, n: int) -> bool:
hash = set()
while True:
if n == 1:
return True
next_n = 0
while n :
next_n += (n%10) ** 2
n = n//10
if next_n in hash:
return False
else:
hash.add(next_n)
n = next_n
1. 两数之和
easy,只要想到用过的信息需要保留再次用就行了
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
record = dict()
for i in range(len(nums)):
if nums[i] in record:
return [record[nums[i]],i]
else:
record[target-nums[i]] = i