哈希表(什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 这句话很重要,在做哈希表题目都要思考这句话)
数组(当哈希值较小且范围也较小可控时)
集合set(当哈希值较大时或者数字比较分散)
当我们要使用集合来解决哈希问题的时候,优先使用unordered_set(使用哈希值直接映射的方式),因为它的查询和增删效率是最优的
如果需要集合是有序的,那么就用set
如果要求不仅有序还要有重复数据的话,那么就用multiset。
映射map(当k与value对应时)
那么再来看一下map ,在map 是一个key value 的数据结构,map中,对key是有限制,对value没有限制的,因为key的存储方式使用红黑树实现的。
力扣242力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
注意:需要使用ord()转换Unicode;需使用range(26)不能in hash
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
hash=[0]*26
for i in s:
hash[ord(i)-ord('a')]+=1
for i in t:
hash[ord(i)-ord('a')]-=1
for i in range(26):
if hash[i]!=0:
return False
return True
力扣349力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
因为题目有数组限制,所以用数组会更方便
1.字典和集合
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
# 使用哈希表存储一个数组中的所有元素
table = {}
for num in nums1:
table[num] = 1
# 使用集合存储结果(集合会自动去重)
res = set()
for num in nums2:
if table.get(num): #或者if num in table:
res.add(num)
return list(res)
2.数组和字典实现
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
hash = {} #定义哈希表存储数组中的元素
res = []
for num in nums1:
hash[num] = 1
for num in nums2:
if hash.get(num):
res.append(num)
hash[num] = 0 #去重
return res
3.集合实现
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1) & set(nums2))
力扣202力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
学到:一个数字所有位置数字平方之和
class Solution:
def isHappy(self, n: int) -> bool:
seen = set()
while n != 1:
n = sum(int(i) ** 2 for i in str(n)) # get new n
if n in seen:
return False
seen.add(n)
return True
力扣1力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思考:①为什么用哈希法 ②为什么用map ③map的作用 ④key ,value分别对应什么
学习:字典的定义 及字典的语法
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
records={} # 或者records=dict()
for index,value in enumerate(nums):
if target - value in records:
return [records[target - value],index]
records[value]=index
return []