哈希表基础
之前经常会用到哈希表, python 中的dict,set 都属于这一类, 也知道哈希表的查找的复杂度是 O(1), 而列表的查找时间是 O(n)。 一般哈希表都是用来快速判断一个元素是否出现集合里。但是对于哈希表的底层实现不了解。
关于哈希表, 哈希函数, 哈希碰撞的文章讲解:代码随想录
242.有效的字母异位词:
思路:判断两个字符串是否是字母异位词, 就是判断字符串A中的所有字符都在B中有相同次数的出现。 可以先循环A 数一下A的每个字符出现的次数存储在 字典中, key 是字符, value 是出现的次数。 再循环B,字符如果在字典中, 字典 key 对应的value 减去1 , 如果最后字典中的所有value 都是0, 那么就是字母异位词。
难点: 无
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
count_s = defaultdict(int)
for char in s:
count_s[char] += 1
for char in t:
count_s[char] -= 1
return all([x==0 for x in count_s.values()])
349. 两个数组的交集
思路:计算两个数组的交集, 两个数组元素可能重复, 重复元素只记录一次。 可以把list 转换成set 直接做, 但是我这里想用两个字典, 第一个类似上题,记录数字在A中出现的次数. 然后循环B 列表, 字典2 记录数字在B 中出现次数。 如果B中的元素在字典1中value 不为0, 但是B 中是0, 那就是交集的元素。
难点: 无
from collections import Counter, defaultdict
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
count1 = Counter(nums1)
count2 = defaultdict(int)
rlst = []
for num in nums2:
if count1[num] != 0 and count2[num] == 0:
rlst.append(num)
count2[num] += 1
return rlst
202. 快乐数:
思路: 如果一个数字多个循环之后的数字出现 各位的数字平方和为1,输出True. 如果没有出现1 而是出现了之前出现过的数字, 那说明它不会有1 出现, 返回False。 用一个set 记录之前出现过的数字就可以了。
class Solution:
def isHappy(self, n: int) -> bool:
occurrence = set()
while True:
_n = sum([int(digit)**2 for digit in str(n)])
if _n == 1:
return True
elif n in occurrence:
return False
else:
occurrence.add(n)
n = _n
1. 两数之和:
思路: 要想实现O(n) 的时间复杂度, 需要用 字典记录已经出现过的数字已经对应的下标, 如果target - num 在字典中, 说明找到了两个数字和是target 的元素。 输出当前下表, 和字典中对应下表就可以了。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
pos = defaultdict(lambda: -1)
for index, num in enumerate(nums):
diff = target - num
if pos[diff] >=0:
return [pos[diff], index]
pos[num] = index
return