242.有效的字母异位词
题目简述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
思路
哈希映射
- 首先判断两个字符串长度是否相等,不相等则直接返回 false
- 若相等,则初始化 26 个字母哈希表,遍历字符串 s 和 t
- s 负责在对应位置增加,t 负责在对应位置减少
- 如果哈希表的值都为 0,则二者是字母异位词
题解
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
result = [0] *26
if len(s) != len(t) :
return False
for i in s:
result[ord(i) - ord("a")] += 1
for i in t:
result[ord(i) - ord("a")] -= 1
for i in range(26):
if result[i] != 0:
return False
return True
== 注 ==
时间复杂度o(n),空间复杂度o(1)
349.两个数组的交集
题目简述
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
思路
- 创建Hash表
- 若一个数组为空,则没有交集
- 遍历数组1,加入hash表,数组中的数为key值
- 遍历数组2,如果数组中的数在hash表中,加入结果数组
题解
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
if not nums1 or not nums2:
return []
#初始化哈希表(字典)
hash = {}
#初始化结果列表
result = []
#哈希表的key为nums1的数,value为值1
for i in nums1:
if not hash.get(i):
hash[i] = 1
#遍历nums2 ,如果nums2中的数在hash表中,加入结果数组,value值为0
for i in nums2:
if hash.get(i):
result.append(i)
hash[i] = 0
return result
== 注 ==
- 用字典创建hash表
- dict.get()返回指定键的值,如果键不在字典中返回 default 设置的默认值
- 本题解遍历了 nums1 和 nums2 数组,所以时间复杂度为 O(n + m),n 和 m 分别为两个数组的长度。
- 额外建了一个哈希表,所以空间复杂度为 O(max(n, m))。
202.快乐数
题目简述
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
思路
- 将当前数进行数位分离,求各位上平方的和。
- 每次生成的数,查是否在哈希集合中,在的话就不是快乐数,不在的话就添到集合里。
题解
class Solution:
#计算num每个位置上数字的平方和
def getNext(self, num):
happy_sum = 0
#从个位开始
while num:
happy_sum += (num % 10) ** 2
num = num // 10
return happy_sum
def isHappy(self, n: int) -> bool:
record = set()
while True:
n = self.getNext(n)
if n == 1:
return True
#如果替换后的数再出现,则进入无限循环
if n in record:
return False
#未出现,加入记录集合
else:
record.add(n)
== 注 ==
求每个数位上的平方和时间复杂度为o(logn)
查询新元素是否在集合中时间复杂度为o(1)
总的时间复杂度为o(logn)
额外创建一个集合空间复杂度为o(logn)