哈希表基础概念
定义:
哈希表是根据关键码的值而直接进行访问的数据结构。
用处:
一般哈希表都是用来快速判断一个元素是否出现集合里。
常见的三种哈希结构:
- 数组
- set (集合)
- map(映射)
使用场景:
当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。
map也一样。
总结:
一种映射,能用数组用数组,最快。
242.有效的字母异位词
这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。
tips:
Pre-assign some space to the list in python before indexing.
Use ord() to convert a single character to its unicode code point.
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
hash_alphbet = [0] * 26 # pre-assign some space to the list
for i in range(len(s)):
hash_alphbet[ord(s[i])-ord('a')] += 1 # In Python, use ord() to convert a single character (like 'a') to its corresponding Unicode code point (an integer).
for i in range(len(t)):
hash_alphbet[ord(t[i])-ord('a')] -= 1
for cnt in hash_alphbet:
if cnt != 0:
return False
return True
349. 两个数组的交集
先确定要用什么数据类型
选择数组or集合:
数组:数据大小有一个范围,且不会太大,也不会有太多空
集合:数据稀疏;数据大小不定(由于要hash运算,耗时比数组长)
set: 红黑树O(logn)
multiset: 红黑树O(logn)
unordered_set: 哈希表O(1)
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
set_nums1 = set(nums1) # unordered_set
result = set()
for element in nums2:
if element in set_nums1:
result.add(element)
return list(result)
1. 两数之和
为什么要用哈希法?
为什么使用map?
map是用来干(存)什么的?
map的value是存放什么的?
什么数据结构,具体用哪个,用来干什么,具体存什么
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
iterated = {}
for i in range(len(nums)):
if (target-nums[i]) in iterated:
return [i, iterated[target-nums[i]]]
else:
iterated[nums[i]]=i
return [] #list(iterated)