Leetcode:242.有效的字母异位词
重要思想:当需要判断一个元素是否出现过时,可以考虑哈希表。
由于本题仅出现26个小写字母,可以用一个数组来存放字母出现的频率,通过ord(i) - ord('a')将字母映射到数组的索引,这样一来即可统计两个字符串各字母出现的频率是否一样了。
注意一点,如果使用数组来实现哈希表,要求数据的范围是有限的
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
r=[0] * 26
for i in s:
r[ord(i)-ord('a')] += 1
for i in t:
r[ord(i)-ord('a')] -= 1
for i in range(26):
if r[i] != 0 :
return False
return True
LC 349. 两个数组的交集
思路和上一题一样,不过换成了使用了字典来统计出现的频率,不过不知道为啥时间比标准答案慢不少
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
d = {}
for i in nums1:
d[i] = d.get(i , 0) + 1
ls = []
for j in nums2:
if j in d:
ls.append(j)
del d[j]
return ls
LC 202 快乐数
注意到若不是快乐数,则计算过程中会出现重复的数字这一点后,就可以使用哈希表了。
至于如何注意到的,算几个特例即可。当然本人一开始也没注意到。。
class Solution:
def isHappy(self, n):
res = set()
while n != 1:
sum = 0
for i in str(n):
sum += int(i) ** 2
n = sum
if n not in res:
res.add(n)
else:
return False
return True
LC 001 两数之和
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
d = {}
for i in range(len(nums)):
if target - nums[i] not in d:
d[nums[i]] = i
else:
return [i,d[target - nums[i]]]
本题比较经典,要想清楚以下两个问题:
1.为什么用哈希表
2.哈希表里的键和值存放的是什么
思考如下:
1.要找相加为target的两数,实际上就是找,当遍历到num时,其对应的target - num是否出现过。
某个元素是否出现过,便想到使用哈希表的思想
2.本题要返回的是两数的索引,因此字典里的值存放索引。if target - nums[i] not in d,即还没找到相加为target的两数,此时把这个数本身和其索引放入字典中,不断遍历,直到找到target - num。
利用到了若a + b = target,那么target -a =b , target - b =a这样的恒等式,一开始存的是a,但遍历到b时发现此时的b满足target - b = a,而a已经被我存放到字典中,于是就把对应的两数找到了。(这句话多想几遍,有点巧妙)