哈希表|242.有效的字母异位词 ,349. 两个数组的交集, 202. 快乐数,1. 两数之和
文档链接:代码随想录
做题感悟:
- 判断哪些元素是否出现过就用哈希表
- 可以使用数组、集合、字典,均可以快速判断元素是否存在。
两数之和比较巧妙:在遍历数组的同时,查询元素是否存在,仅仅使用一次遍历就能判断元素是否出现过。- 有关字典的基础操作,容易忘:
dit.get(key,value)
寻找字典中key
是否存在,并指定函数返回值value
.
dit.keys()
返回字典的key列表
dit.value()
返回字典的value值
ans=[],ans.append(a)
将元素a推入栈内
ans.pop()
将第一个元素推出去
题目一:242.有效的字母异位词 ——30min
- 先遍历数组,得到字典
- 比较两个字典是否一致
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
ditS={}
ditT={}
for i in s:
if ditS.get(i):#如果找到了
ditS[i] += 1
else: ditS[i] = 1#如果返回None,找不到这个健,get函数用于查询该键是否存在,并可以规定返回值
for i in t:
if ditT.get(i):
ditT[i] += 1
else: ditT[i] = 1
print(ditS,ditT)
return ditS==ditT
#18:17——18:33:有空总结一下字典的使用方法,以及其他表示哈希表的方法
题目二:349. 两个数组的交集—30min
- 先将列表遍历,存到字典中
- 在遍历列表,查询另一个链表中的元素。
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
#先遍历其中一个列表,梳理其中的元素
#在遍历链表中的键
dict1={}
dict2={}
ans=[]
for i in nums1:
if dict1.get(i):#如果找得到
dict1[i] += 1
else:dict1[i] = 1
for i in nums2:
if dict2.get(i):#如果找得到
dict2[i] += 1
else:dict2[i] = 1
for j in dict1.keys():
print(j)
if dict2.get(j):#如果在dict2中能找到
ans.append(j)
return ans
题目三:202. 快乐数—1.5h
- 此处使用集合,
record=set()
初始化集合,注意区分字典初始化dict={}
record.add()
通过该代码为集合增加元素- 注意快乐数的加和重复,就会陷入死循环。反之就是快乐数。
class Solution:
def isHappy(self, n: int) -> bool:
#要记录是否和值会出现循环
record = set()#定义一个集合,{}是定义一个字典
while True:
n = self.getSum(n)# 先计算总和
if n == 1: return True # 最后是1就可以返回
if n in record: return False #如果出现了重复,就会陷入死循环
else: record.add(n)
def getSum(self, n: int) -> int:
n_str = str(n) # 将整数变为字符串
sum = 0
for i in n_str:
sum += int(i) ** 2
return sum
题目四:1.两数之和——1.5h
- 整体思路:
1、遍历数组的同时,判断该元素在字典中是否存在匹配的的元素。
2、一遍遍历元素,同时查询字典不会二次遍历,如果先合成字典,在遍历查询是否有匹配的元素,就会漏掉相同元素,索引不同的情况
3、如果存在匹配的元素,则返回当前索引以及匹配值的索引,如若不存在,则放入字典中。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
#先遍历数组,查询字典中是否又匹配的值,没有则放入字典中
#如果需要快速查找元素,就用哈希表
dict={}
for i in range(len(nums)):
j=target-nums[i]
if dict.get(j) == None:# 如果没找到
dict[nums[i]]=i
else:#如果没找到,就重新加入
return [i,dict[j]]