算法训练营第五天 | 哈希表理论基础、 242.有效的字母异位词、349. 两个数组的交集、 202. 快乐数、1. 两数之和
哈希表理论基础
哈希表内部实现原理: 哈希表是根据关键码的值而直接进行访问的数据结构。人话就是,哈希表就是一个数组,关键码就是下标,哈希函数就是计算下标的函数。
哈希函数: 计算下标的函数,决定数据存放在哈希表的位置
哈希碰撞: 两个数据通过哈希函数计算出来的下标相同。
哈希碰撞解决方案:
-
拉链法
-
线性探索法
常见哈希表的区别:
-
数组:
-
set:
-
map:
什么时候想到哈希法?: 当我们遇到要快速判断一个元素是否出现在集合里的时候,就要考虑哈希法。
但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。
如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!
242.有效的字母异位词
题目
思路与解法
第一想法: 使用字典来存储一个字符串中每个字母出现的次数,再用另一个去对比
class Solution:def isAnagram(self, s: str, t: str) -> bool:set_s = dict()for a in s:if set_s.get(a, False):set_s[a] += 1else:set_s[a] = 1for b in t:if set_s.get(b, False):set_s[b] -= 1if set_s[b] < 0:return Falseelse:return Falsefor key,value in set_s.items():if value > 0:return Falsereturn True
349. 两个数组的交集
题目
思路与解法
第一想法:
# Counter会自动为nums1创建一个字典,key是nums1中的每个元素,value是数量
class Solution:def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:from collections import Countercounter1 = Counter(nums1)res = set()for i in nums2:if i in counter1:res.add(i)return list(res)
202. 快乐数
题目
思路与解法
第一想法: 没想出来
carl的讲解: 重点在于,不是快乐数,结果会重复出现
class Solution:def isHappy(self, n: int) -> bool:record = set()while n not in record:record.add(n)sum = 0for i in str(n):sum += int(i) ** 2if sum == 1:return Truen = sumreturn False
1. 两数之和
题目
思路与解法
第一想法: 遍历数组,将target - nums[i]存入字典,key为target - nums[i], value为i(下标)。每次遍历都去字典中找有没有自己,有的话证明之前有过和自己相加等于target的值出现,这时就返回自己的i和record中记录的i
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:record = dict()for i in range(len(nums)):if nums[i] in record:return [i,record[nums[i]]]else:record[target-nums[i]] = i## 改进
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:record = dict()for index, num in enumerate(nums):if num in record:return [index,record[num]]else:record[target-num] = index