代码随想录算法训练营第五天(哈希表篇)|Leetcode242有效的字母异位词,Leetcode349两个数组的交集,Leetcode202快乐数,Leetcode1两数之和
Leetcode 242 有效的字母异位词
题目链接: 有效的字母异位词
给定两个字符串,判断其中一个字符串是否为另一个字符串的字母异位词(即字母种类和个数均能一一对应,仅位置不同)
例如anagram和nagaram互为彼此的字母异位词
思路: 统计一个字符串中所有字符,再遍历另一个字符串,若发现字母种类或者个数无法对应,则不是有效的字母异位词,否则是有效的字母异位词
具体代码实现:
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
# 用字典记录每个字母出现的频率
if len(s) != len(t):
return False
mymap = dict()
for ch in s:
mymap[ch] = mymap.get(ch, 0) + 1
for ch in t:
mymap[ch] = mymap.get(ch, 0) - 1
for val in mymap.values():
if val != 0:
return False
return True
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
# 利用计数器类进行判断
from collections import Counter
return Counter(s) == Counter(t)
时间复杂度: O(n)
Leetcode 349 两个数组的交集
题目链接: 两个数组的交集
思路: 分别记录在数组1和数组2中出现过的数字,若一个数字在两个数组中均出现过,则将其加入到集合中
具体代码实现:
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
# 利用数组作为哈希表进行处理
count1 = [0] * 1001
count2 = [0] * 1001
for num in nums1:
count1[num] += 1
for num in nums2:
count2[num] += 1
result = []
for num in range(1001):
if count1[num] * count2[num] > 0:
result.append(num)
return result
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
# 直接用集合进行去重,随后取并集即可
return list(set(nums1) & set(nums2))
Leetcode 202 快乐数
题目链接: 快乐数
给定一个数,计算该数上各位数的平方之和,重复这一操作,若最终得到的结果为1,则判断该数为快乐数,若计算过程中出现无限循环无法凑出1,则说明该数不是快乐数
思路: 维护一个集合,记录在计算过程中得到的结果,若当前计算结果已经出现在过往的结果集中,则说明当前出现了循环,给定的数字不是快乐数
具体代码实现
class Solution:
def isHappy(self, n: int) -> bool:
past_sum = set()
while n != 1:
n = self.getHappySum(n)
if n in past_sum:
return False
past_sum.add(n)
return True
def getHappySum(self, num: int) -> int:
"""给定一个数,返回其各个位置上数的平方和"""
sum = 0
while num:
cur = num % 10
sum += cur ** 2
num = num // 10
return sum
Leetcode 1 两数之和
题目链接: 两数之和
给定一个数组nums和一个目标和target,要求从数组中找出两个数字,使这两个数字之和等于目标值,并返回这两个数字的下标。题目保证一定存在符合条件的两个数。
思路: 有两种解法,既可以通过暴力解法,利用两层循环遍历数组找出符合条件的两个元素,并返回其下标。也可以遍历一遍数组,在遍历过程中,维护一个字典,其中记录元素值-数组下标键值对。每遍历一个元素num时,检查target-num是否已经存在于元素值中,若已经存在,则返回当前num对应的下标和target-num元素在数组中对应的下标即可。
具体代码实现
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# 暴力解法
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# 哈希表法
mydict = dict()
for idx in range(len(nums)):
if (target-nums[idx]) in mydict:
return [mydict[target-nums[idx]], idx]
mydict[nums[idx]] = idx
return []
时间复杂度: O(n^2)(暴力解法), O(n)(哈希表法)

浙公网安备 33010602011771号