第十五周 哈希表
1 两数之和
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# 暴力法
for i in range(len(nums)-1):
for j in range(i+1,len(nums)):
if nums[i]+nums[j]==target:
return [i,j]
# 哈希表法
hashtable = dict()
for i, ele in enumerate(nums):
if target-ele in hashtable:
return [i, hashtable[target-ele]]
else:
hashtable[ele] = i
136 只出现一次的数字
class Solution:
def singleNumber(self, nums: List[int]) -> int:
# 统计出现次数用Counter,key:value是ele:times
cnt = Counter(nums)
for i in cnt:
if cnt[i] == 1:
return i
#也可以排序,连续两个不同的就是唯一一个不同的了。
202 快乐数
class Solution:
def isHappy(self, n: int) -> bool:
# 无限循环,其实是出现了已经见过的数字,所以用set记录visited
visited = set()
# 回溯就是用while,这可太好用了
while n not in visited and n != 1: # 退出只有两种情况:n为1,或者出现重复
visited.add(n)
cnt = 0
while n:
cnt += (n%10)**2
n //= 10
n = cnt
return n==1 # n==1返回true 否则false
299 猜数字游戏
class Solution:
def getHint(self, secret: str, guess: str) -> str:
# 妈耶,自己想的,居然AC了
numa, numb = 0, 0
tmpa, tmpb = secret, guess
while secret:
if secret[-1] == guess[-1]:
numa += 1
secret = secret[:-1]
guess = guess[:-1]
secret, guess = tmpa,tmpb
seta, setb = Counter(secret), Counter(guess)
for i in seta:
numb += min(seta[i],setb[i])
res=str(numa)+'A'+str(numb-numa)+'B'
return res
347 前k个高频元素
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
numsset = Counter(nums)
# 对set按照value排序,从大到小是-的
numsset = sorted(numsset.items(),key = lambda x:-x[1])
return [numsset[i][0] for i in range(k)]
560 和为K的子数组
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
# 暴力,超时
# res = 0
# for i in range(len(nums)):
# for j in range(i,len(nums)):
# if sum(nums[i:j+1])==k: res+=1
# return res
# 如果i到j的和是k,那么sum(0,j)-sum(0,i)=k,也就是说,在j处sum和减k后的sum曾经出现过n次,那么res+=n。
# 因此,保存前面出现过的和的个数,就可以避免重复计算sum。
canget = {0:1}
res = 0
calsum = 0
for ele in nums:
calsum+=ele
needed = calsum-k
if needed in canget:
res += canget[needed]
# calsum在canget中出现过的次数如果存在就返回这个value,否则返回0
canget[calsum] = canget.get(calsum,0)+1
return res
336 回文对
困难,再见👋