当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法,是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。
242.有效的字母异位词
题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
视频讲解
学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili
笔记
- 第一种思路是用数组,数组大小为26,初始化为0,每个位置记录对应字母出现的次数,字母a出现次数的下标为ord(a)-ord(a),即0,同理,字母b出现次数的下标为ord(b)-ord(a)……。遍历第一个字符串时,对应次数加一,遍历第二个字符串时,对应次数减一,最后遍历数组,如果有位置的值不为0,说明对应字母的出现次数不一样
- 第二种思路使用collections中的defaultdict(int)方法,用一个字典存第一个字符串的字母及对应出现次数,第二个字典存另一个字符串的字母及对应出现次数,最后判断两字典是否相等
- 第三种思路使用collections的Counter(s)方法,判断Counter(s)是否等于Counter(t)
Python代码
#思路一
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
res = [0]*26
for i in s:
res[ord(i)-ord('a')] += 1
for j in t:
res[ord(j)-ord('a')] -= 1
for i in res:
if i != 0:
return False
return True
#------------------------------------------------------------------------
#思路二
from collections import defaultdict
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
dict_s = defaultdict(int)
dict_t = defaultdict(int)
for i in s:
dict_s[i] += 1
for j in t:
dict_t[j] += 1
return dict_s == dict_t
#------------------------------------------------------------------------
#思路三
from collections import Counter
return Counter(s) == Counter(t)
349. 两个数组的交集
题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
视频讲解
学透哈希表,set使用有技巧!Leetcode:349. 两个数组的交集_哔哩哔哩_bilibili
笔记
- 最直白的思路,用集合,判断是否有交集(交集:& 并集:|)
- 也可以用字典defaultdict(int)
Python代码
#用集合
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
set1 = set(nums1)
set2 = set(nums2)
return list(set1 & set2)
#用字典defaultdict
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
from collections import defaultdict
dict1 = defaultdict(int)
res = []
for i in nums1:
dict1[i] += 1
for k,v in dict1.items():
if k in nums2:
res.append(k)
return res
202. 快乐数
题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解
笔记
- 定义一个求数字各位数平方和的函数sumNumber(n)
- 关键点在于题目说平方和出现循环,也就是和之前重复的数值,那么该数就不是快乐数,因此用一个字典存放每次的各位数平方和,每次计算新的各位数平方和时先判断该值在不在字典中,如果在就返回False,不是就继续循环,直到找到值为1返回True。
Python代码
class Solution:
def isHappy(self, n: int) -> bool:
def sumNumber(a):
s = len(str(a))
res = 0
for i in range(s):
res += pow(a%10,2)
a //= 10
return res
from collections import defaultdict
tmpDict = defaultdict(int)
k = sumNumber(n)
while k != 1:
if k in tmpDict:
return False
else:
tmpDict[k] += 1
k = sumNumber(k)
return True
1. 两数之和
题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
视频讲解
梦开始的地方,Leetcode:1.两数之和,学透哈希表,map使用有技巧!_哔哩哔哩_bilibili
笔记
- 用一个字典存放遍历过的元素值及对应的下标
- 遍历新元素时,判断target减去当前元素的差值是否在字典中,如果在,说明找到了答案,返回对应下标组成的数组;如果不在,把当前值和对应的下标存到字典中,继续往后遍历,直到找到符合条件的下标返回,因为题目说一定存在答案
- 该思路实现了时间复杂度为O(n)的算法
Python代码
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
from collections import defaultdict
dict1 = defaultdict(int)
for i in range(len(nums)):
if target-nums[i] in dict1:
return [dict1[target-nums[i]], i]
else:
dict1[nums[i]] = i