classSolution:defmaxSlidingWindow(self, nums: List[int], k:int)-> List[int]:
n =len(nums)if n ==0:return[]
q =[[-nums[i],i]for i inrange(k)]# python默认小顶堆,因此取负,先把第一个窗口元素放进去
heapq.heapify(q)# 小顶堆
ans =[-q[0][0]]#先把第一个窗口的最大值放进答案for i inrange(k,n):
heapq.heappush(q,[-nums[i],i])#窗口向右移动一个,放进去一个元素while q[0][1]<=i-k:#如果最大的元素的下标不在本次窗口内,要先删掉他们
heapq.heappop(q)
ans.append(-q[0][0])# 目前q的最大值一定在窗口范围内的return ans
剑指 Offer 59 - II. 队列的最大值
import queue
classMaxQueue:def__init__(self):
self.deque=queue.deque()
self.queue=queue.Queue()defmax_value(self)->int:return self.deque[0]if self.deque else-1defpush_back(self, value:int)->None:while self.deque and self.deque[-1]<value:
self.deque.pop()
self.deque.append(value)
self.queue.put(value)defpop_front(self)->int:ifnot self.deque:return-1
ans = self.queue.get()if ans==self.deque[0]:
self.deque.popleft()return ans
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
classSolution:deflowestCommonAncestor(self, root:'TreeNode', p:'TreeNode', q:'TreeNode')->'TreeNode':defdfs(node,target,path):ifnot node:returnif node == target:
path.append(node)return node
left = dfs(node.left, target, path)if left:
path.append(node)return node
right = dfs(node.right, target, path)if right:
path.append(node)return node
q_path=[]
p_path=[]
dfs(root, q, q_path)
dfs(root, p, p_path)for i in q_path:if i in p_path:return i
剑指 Offer 49. 丑数
classSolution:defnthUglyNumber(self, n:int)->int:
h =[1]
heapq.heapify(h)
res=[]whilelen(res)< n:
min_num=heapq.heappop(h)
res.append(min_num)while h and h[0]==min_num:
heapq.heappop(h)for i in[2,3,5]:
heapq.heappush(h, min_num*i)return res[-1]
剑指 Offer 46. 把数字翻译成字符串
classSolution:deftranslateNum(self, num:int)->int:
s =str(num)
dp =[1for _ inrange(len(s)+1)]for i inrange(2,len(s)+1):if s[i-2]=='1'or s[i-2]=='2'and s[i-1]<'6':# 前面两个数字可以组合在一起翻译
dp[i]= dp[i-1]+dp[i-2]#有两种可能,一种是每一个数字单独翻译dp[i-1],另一种是两个组合翻译dp[i-2]else:
dp[i]= dp[i-1]# 两个数字只能单独翻译,那么就没有第二种可能,没有增加新的翻译可能return dp[-1]
剑指 Offer 63. 股票的最大利润
classSolution:defmaxProfit(self, prices: List[int])->int:ifnot prices:return0
min_price=prices[0]
ans=0for price in prices:
ans =max(ans,price-min_price)
min_price=min(price,min_price)return ans
剑指 Offer 64. 求1+2+…+n
classSolution:def__init__(self):
self.res =0defsumNums(self, n:int)->int:
n>1and self.sumNums(n-1)# 逻辑运算符短路效应,if A and B:如果A是False则不会判断B是否成立直接返回False,因此这里当n=1的时候,n>1为False,则不会运行后面的sumNum,从而停止递归
self.res += n
return self.res