day 13
239. 滑动窗口最大值
Python的Deque模块详解
链接: Python的deque模块详解
solution 我复制的,好难不会写
理解了思路,看代码模拟!!
from collections import deque
class MyQueue: #单调队列(从大到小
def __init__(self):
self.queue = deque() #这里需要使用deque实现单调队列,直接使用list会超时
#每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。
#同时pop之前判断队列当前是否为空。
def pop(self, value):
if self.queue and value == self.queue[0]:
self.queue.popleft()#list.pop()时间复杂度为O(n),这里需要使用collections.deque()
#如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。
#这样就保持了队列里的数值是单调从大到小的了。
def push(self, value):
while self.queue and value > self.queue[-1]:
self.queue.pop()
self.queue.append(value)
#查询当前队列里的最大值 直接返回队列前端也就是front就可以了。
def front(self):
return self.queue[0]
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
que = MyQueue()
result = []
for i in range(k): #先将前k的元素放进队列
que.push(nums[i])
result.append(que.front()) #result 记录前k的元素的最大值
for i in range(k, len(nums)):
que.pop(nums[i - k]) #滑动窗口移除最前面元素
que.push(nums[i]) #滑动窗口前加入最后面的元素
result.append(que.front()) #记录对应的最大值
return result
347. 前 K 个高频元素(一刷我没有用栈,用的哈希法)
solution(hash)
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
frequency=dict()
for i in nums:
if i in frequency:
frequency[i]+=1
else:
frequency[i]=1
fre=sorted(frequency.items(),key=lambda item:item[1],reverse=True)
res=[]
for i in range(k):
res.append(fre[i][0])
return res
dict的排序
sorted(iterable,*,key=None,reverse=False)
newdict=sorted(frequency.items(),key=lambda item:item[1],reverse=True)