哈希表
常见的三种哈希结构:数组、set(集合)、map(映射)
要快速判断一个元素是否出现集合里,考虑哈希法!
242.有效的字母异位词
题目:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
解题:
思路:将 a ~ z 的字符映射到数组 hush [0 ~ 25],对s和t字符串统计每个字符出现的频率,相减如果hush[0~26]都为0就表示出现频率相等。
- 如何将 a ~ z 映射到 0 ~ 25 ?通过ASCII码的相对值作为数组下标:ord[i]-ord['a']
- 如何判断是否s、t是否是字母异位词?通过相减:hush[0~25]均=0
注:1.不用分别统计频率,统计t的时候,直接在统计s求得的hush[]基础上相减;
2.python不能直接对字符进行运算,要用ord()求ASCII码值;
3.s是字符串,for i in s:i就是字符。
点击查看代码
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
hush=[0]*26
for i in s:
hush[ord(i)-ord('a')]+=1
for i in t:
hush[ord(i)-ord('a')]-=1
for i in range(26):
if hush[i]!=0:
return False
return True
349. 两个数组的交集
题目:给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
提示:0 <= nums1[i], nums2[i] <= 1000
解题:
经典思路:使用哈希表存储所有元素,再判断后存储结果。
- 哈希表的数据结构的选择?如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费!
nums[i]值小于1000,可以用nums中的数值num作为下标。有限时:num可以作为数组下标;无限时:num可以作为集合的元素,也可以作为字典的键。 - 交集结果的数据结构的选择?集合:判断是否出现;数组:判断相乘是否为0。
一、都用集合,python写法太简洁了!
点击查看代码
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1)&set(nums2))
二、数组
点击查看代码
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
list1=[0]*1001
list2=[0]*1001
res=[]
for i in range(len(nums1)):
list1[nums1[i]]+=1
for i in range(len(nums2)):
list2[nums2[i]]+=1
for i in range(1001):
if list1[i]*list2[i]!=0:
res.append(i)
return res
三、
心得:
集合增加元素:res.add()
数组增加元素:res.append()
关键在于如何选取数据结构,判断什么是下标