文章总结:(哈希表)
哈希函数
通过哈希函数可以将数组映射到哈希表中(将名字转化为数并作为索引储存在哈希表中)
哈希碰撞
但是当映射时会发生两个姓名(索引)映射到同一个位置的情况(索引的数量有限,因为一般情况都是固定长度的储存单元),这就是发生了哈希碰撞。
常见的三种哈希结构
数组
set(集合)
map(映射)
set:
集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
std::set | 红黑树 | 有序 | 否 | 否 | O(logn) | O(logn) |
std::multiset | 红黑树 | 有序 | 是 | 否 | O(logn) | O(logn) |
std::unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
map:
映射 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
std::map | 红黑树 | 有序 | 否 | 否 | O(logn) | O(logn) |
std::multimap | 红黑树 | 有序 | 是 | 否 | O(logn) | O(logn) |
std::unordered_map | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
题目总结:
242 有效的字母异位词
题目:
给出两个字符串,如果两个单词只是字母顺序不同其余相同(字母以及对应个数相同)则成为两个字符串为异位词
要点:(其中则是利用了Map的思想)
通过ord()来获取字母“a”的ascii码,因此其余的字母可以通过ascii码的差值进行标记
class Solution(object):
def isAnagram(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
record = [0] * 26
for i in s:
record[ord(i) - ord("a")] += 1
for i in t:
record[ord(i) - ord("a")] -= 1
for i in range(26):
if record[i] != 0:
return False
return True
349. 两个数组的交集
题目:
找出两个数组中相同的元素
要点:
和上题相同,首先通过map记录nums1中的所有元素以及相对应的个数(都为1,因为要在开始时就将删除重复数据),只挑选个数为1的数进行第二次的筛选
class Solution(object):
def intersection(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
val_dict = {}
res = []
for num in nums1:
val_dict[num] = 1
for num in nums2:
if num in val_dict.keys() and val_dict[num] == 1:
res.append(num)
val_dict[num] -= 1
return res
202. 快乐数
题目:
题目中提及到了可能出现无限循环
想要阻止无线循环的方法就是查看每次的生成的平方和是否原来出现过
要点:
写出一个完成平方和的函数,需要每次循环时调用
利用哈希表来查询每次生成的平方和是否原来出现过,出现过就说明存在无限循环
class Solution(object):
def isHappy(self, n):
"""
:type n: int
:rtype: bool
"""
def calculate_happy(num):
sum_ = 0
while num:
sum_ += (num % 10) ** 2
num = num // 10
return sum_
record = set()
while True:
n = calculate_happy(n)
if n == 1:
return True
if n in record:
return False
else:
record.add(n)
1. 两数之和
题目:
要点:
先将nums中的元素归入map中(哈希表,为了快速查找其中是否有对应元素)
要将原本的nums中的索引和对应数值互换
然后利用target - num寻找另外一个元素的位置
最后如果没有对应的和时,返回 []
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
records = dict()
for index, num in enumerate(nums):
if target - num in records:
return [records[target - num], index]
records[num] = index
return []