剑指 Offer 59 - I. 滑动窗口的最大值
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
if not nums:
return []
deque = collections.deque() #非严格递减
res=[]
for i in range(0,k): #0到k-1 一共k个数 此阶段 deque不用左出队
while deque and deque[-1]<nums[i]: #从后往前检查若小于nums[i]则出队
deque.pop()
deque.append(nums[i])
res.append(deque[0]) #窗口满啦 得到第一个窗口对应的最大值
for i in range(k,len(nums)): #此阶段窗口左侧有出队
while deque and deque[-1]<nums[i]:
deque.pop()
deque.append(nums[i])
if nums[i-k]==deque[0]: #窗口左侧出队数字等于deque[0]时,deque需要左出队
deque.popleft()
res.append(deque[0]) #得到当前窗口内最大值
return res
剑指 Offer 30. 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
lass MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack=[]
self.minatlast=[] #只需记录当前最小值,
def push(self, x: int) -> None:
self.stack.append(x)
if len(self.minatlast)==0 or self.minatlast[-1]>=x:
#self.minatlast[-1]>=x 等于时也入栈 stack=[0,1,0] minatlast=[0,0] pop then minatlast=[0]
self.minatlast.append(x)
else:
pass #因为出栈也是按顺序出栈,当前x永远不可能成为最小值不需要记录
return
def pop(self) -> None:
if self.stack[-1]==self.minatlast[-1]:
self.minatlast.pop()
self.stack.pop()
return
def top(self) -> int:
return self.stack[-1]
def min(self) -> int:
return self.minatlast[-1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.min()
定义队列数据结构
class Queue(object):
#定义一个空队列
def __init__(self):
self.items = []
#队列(只能在队尾)添加一个元素
def enqueue(self, item):
self.items.append(item)
#删除队列(只能在对头)一个元素
def dequeue(self):
self.items.pop(0)
#判断队列是否为空
def isEmpty(self):
return(self.items == [])
#清空队列
def clear(self):
del(self.items) #该队列就不存在了,而不是清空元素
#返回队列项的数量
def size(self):
return(len(self.items))
#打印队列
def print(self):
print(self.items)
if __name__ == '__main__':
q = Queue()
print(q.isEmpty())
for i in range(5):
q.enqueue(i)
print(q.size())
q.print()
q.dequeue()
q.print()
q.clear()
print(q)
Python 队列(Queue)用法
Python标准库中包含了四种队列,分别是queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque
collections.deque
deque是双端队列(double-ended queue)的缩写,由于两端都能编辑,deque既可以用来实现栈(stack)也可以用来实现队列(queue)。
deque支持丰富的操作方法,主要方法如图:
deque也支持in操作符,可以使用如下写法:
q = collections.deque([1, 2, 3, 4])
print(5 in q) # False
print(1 in q) # True