哈希表主要解决的问题:判断一个元素是不是在某个集合之中。
主要的表现形式:数组、集合、以及map形式
按照以前经验,应该是用python中的dict形式实现字典,实现map的格式形式,实现键值对应。
242.有效的字母异位词
用数组去构造一个哈希表固然很简单,注意一下ord函数的意义,
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
record = [0]*26
for i in s:
record[ord(i)-ord("a")] += 1
for j in t:
record[ord(j)-ord("a")] -= 1
for k in record:
if k != 0:
return False
return True
构建一个字典储存哈希表的形式
注意怎么遍历,将元素建立成一个初始的哈希表!!!
本质上这两种方法应该是差不多的,后者可能更节省空间,而且更加灵活一些!
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
hashtable = dict()
for i in s:
if i not in hashtable.keys():
hashtable[i] = 1
else:
hashtable[i] += 1
for j in t:
if j not in hashtable.keys():
return False
else:
hashtable[j] -= 1
for k in hashtable.values():
if k != 0:
return False
return True
349. 两个数组的交集
还是按照上面的思路,建立哈希表之后,set进行去重,有一点讨巧!但是应该可以靠这种方法去a题。
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
num = []
hashtable = dict()
for i in nums1:
if i not in hashtable.keys():
hashtable[i] = 1
for j in nums2:
if j in hashtable.keys():
num.append(j)
return list(set(num))
这道题的一个关键是怎么进行去重,建立一个函数,重复调用去储存键值,最后对比键是否是在另一个哈希表之中,即可!
但是应该空间有优化的地方,毕竟是占用了两个哈希表。
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
num = []
def hashtable(nums):
hashtable = dict()
for nums in nums:
if nums not in hashtable.keys():
hashtable[nums] = 1
return hashtable
hashtable1,hashtable2 = hashtable(nums1),hashtable(nums2)
for i in hashtable1.keys():
if i in hashtable2.keys():
num.append(i)
return num
顺手把350两个数组的交集 II写了,其实思路差不多,只是多存储了一下出现的次数。
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
num = []
def createhashtable(nums):
hashtable = dict()
for i in nums:
if i not in hashtable.keys():
hashtable[i] = 1
else:
hashtable[i] += 1
return hashtable
hashtable1,hashtable2 = createhashtable(nums1),createhashtable(nums2)
for i in hashtable1.keys():
if i in hashtable2.keys():
n = min(hashtable1[i],hashtable2[i])
for j in range(n):
num.append(i)
return num
202. 快乐数
这种数字游戏,之前是难想到的,但是在中学时代,我记得我去玩过,如果不是快乐数的话,会不停地陷入一个循环之中去,所以可以把每一次计算的值用哈希表储存起来,重复的部分可以用一个函数不断调用即可!
class Solution:
def isHappy(self, n: int) -> bool:
#设计一个函数,计算数字的各位的平方和
def sum_square(n):
# #分别找数来记录整除结果,余数,以及平方的和
num = 0
while n > 0:
n,b = n//10,n%10
num += b**2
return num
hashtable = dict()
while n != 1:
if n not in hashtable.keys():
hashtable[n] = 1
n = sum_square(n)
else:return False
#跳出循环说明是一个快乐数
return True
但是好像如果只用判断元素是不是在哈希表中,不需要对应的值,可以用集合或者数组实现
hashtable = set()
while n != 1:
if n not in hashtable:
hashtable.add(n)
n = sum_square(n)
else:return False
类似的,用数组也肯定可以,对应的操作是append
1. 两数之和
又回到了梦开始的地方,还记得当时是写个双重循环暴力循环都会出错的时候,现在感慨时间过的好快啊!
简单再a一下吧!
记一下enumerate这个函数,还是比较重要的,在一次遍历中,可以读取列表中每个元素的下标以及下标处对应的值
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtable = dict()
for i,num in enumerate(nums):
if target - num not in hashtable.keys():
hashtable[num] = i
else:
return [i,hashtable[target-num]]