目录
哈希表理论基础
建议:
大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。
什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 这句话很重要,大家在做哈希表题目都要思考这句话。
当我们遇到了要快速判断一个元素是否出现集合里时,就要考虑哈希法。 ——Carl
242.有效的字母异位词
题目链接/文章讲解/视频讲解: 代码随想录
思路
我的思路貌似和哈希沾不上边,先判断两个string字符串长度一不一样,不一样直接return False,一样的话,先把第一个字符串的元素遍历加入data[]列表中,然后遍历第二个字符串,如果在data[]中就删去,只要没报错就return True,有一个没在data[]里就return False。
Carl哥的思路直接看链接。
代码
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
if len(s)!=len(t):
return False
data = []
for i in s:
data.append(i)
for i in t:
if i in data:
data.remove(i)
elif i not in data:
return False
return True
aa=Solution()
print(aa.isAnagram("asdd","assd"))
349.两个数组的交集
建议
本题就开始考虑 什么时候用set 什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和 测试用例,添加了 0 <= nums1[i], nums2[i] <= 1000 条件,所以使用数组也可以了,不过建议大家忽略这个条件。 尝试去使用set。
题目链接/文章讲解/视频讲解:代码随想录
思路
用python嘎嘎乱杀,我先创建一个列表data=[ ],然后直接遍历长度较短的数组,如果遍历到的这个数在较长的那个数组里面,并且不在列表里,就加入到列表中,最后直接返回data。
Carl哥的思路就是用字典和集合set,先遍历第一个数组,把每一个字出现的频次保存为字典的值,然后遍历另一个数组,如果这个字出现在刚才的字典里话就把这个字添加到set里,同时删除字典对应的键值对,避免重复。
代码
Carl代码看链接,大部分语言都有。
from typing import List
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
data = []
if len(nums1) >= len(nums2):
for i in nums2:
if i in nums1 and i not in data:
data.append(i)
elif len(nums2) > len(nums1):
for i in nums1:
if i in nums2 and i not in data:
data.append(i)
return data
202.快乐数
建议:这道题目也是set的应用,其实和上一题差不多,就是 套在快乐数一个壳子
题目链接/文章讲解:代码随想录
思路
坚持坚持再坚持!!!多坚持一秒说不定就不用看题解了。这道题关键在于怎么知道这个数是永远无法平方和为1的,就是他会无限循环。我一开始自己模拟了一下,一直想不到怎么判定,直到看了题解,唉,再往下推导3次就看到循环了。。。其他都不是很难。
代码
class Solution:
def isHappy(self, n: int) -> bool:
data = []
while n != 1:
temp = 0
for i in str(n):
temp += int(i) * int(i)
n = temp
if temp not in data:
data.append(temp)
else: # 出现循环就返回False
return False
return True
1.两数之和
建议:本题虽然是 力扣第一题,但是还是挺难的,也是 代码随想录中 数组,set之后,使用map解决哈希问题的第一题。题目链接/文章讲解/视频讲解:代码随想录
思路
不要害怕,你不是一个人。
用到了python中的字典,主要是字典平时用的少,python还是列表居多。熟练使用字典的话还是很好理解的。
遍历数组里的每一个数,同时遍历索引,可以用enumerate()实现的,如果(target-这个数)已经存在字典里,那就说明有解,直接返回。
如果不存在,就把遍历的这个数作为键,索引作为值,加入字典中。
代码
from typing import List
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
records=dict()
for index,value in enumerate(nums):
if target - value in records:
return [records[target-value],index]
records[value]=index
return []