本系列文章是我刷代码随想录过程中的笔记。代码地址:leetcode
今天是我刷“代码随想录”的第五天
今日内容
- 哈希表理论基础
- 242.有效的字母异位词
-
- 两个数组的交集
-
- 快乐数
-
- 两数之和
哈希表理论基础
哈希表是根据关键码的值而直接进行访问的数据结构。简单理解的话,就是一个数组。我们可以根据数组的索引来获取数组的值。 那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里。
哈希函数
将元素转化成哈希表上的索引的函数
哈希碰撞
在计算索引的时候,难免会遇见两个元素的索引一致。此时就发生了哈希碰撞。解决方法有两个
-
拉链法
在已有元素后面以链表的的形式储存
-
线性探测法
在下面找一个空位存储
leetcode 242. 有效的字母异位词
这道题定义两个哈希表,分别存储s,t中的字符及其个数。最后比较两个哈希表是否相等。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
dic_s = dict()
dic_t = dict()
for i in s:
if i in dic_s:
dic_s[i] += 1
else:
dic_s[i] = 1
for i in t:
if i in dic_t:
dic_t[i] += 1
else:
dic_t[i] = 1
return dic_s == dic_t
leetcode 349. 两个数组的交集
先记录出现的元素,并记录为1,然后从另一个数组中判断是否存在,如果存在就将其添加到结果中。
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
val_dict = {}
ans = []
for num in nums1:
val_dict[num] = 1
for num in nums2:
if num in val_dict.keys() and val_dict[num] == 1:
ans.append(num)
val_dict[num] = 0
return ans
leetcode 202. 快乐数
定义一个集合,记录每次计算的和。当和为1时,直接返回true。如果和在集合中出现过,说明进入了循环,直接返回false
class Solution:
def isHappy(self, n: int) -> bool:
s = set()
while True:
sum = self.sum(n)
if sum in s:
return False
if sum == 1:
return True
n = sum
s.add(n)
def sum(self, n):
s = 0
while n:
s += (n % 10) ** 2
n //= 10
return s
leetcode 1. 两数之和
定义一个哈希表记录当前位置和另一个数。如果另一个数在,返回两个下标即可。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
d = dict()
for i in range(len(nums)):
if nums[i] not in d:
d[target - nums[i]] = i
else:
return [i, d[nums[i]]]