(一)双栈实现队列
栈:先进后出;队列:先进先出
存储n个元素的空间复杂度为O(n),插入与删除的时间复杂度都是O(1)
class Solution:
def __init__(self):
self.stack1 = []
self.stack2 = []
def push(self, node):
# write code here
self.stack2.append(node)
def pop(self):
# return xx
if not self.stack1:
while self.stack2:
self.stack1.append(self.stack2.pop())
return self.stack1.pop()
(二)包含最小值的栈
正常计算最小值计算复杂度为o(n)。本题中通过添加辅助栈,以空间换时间可以达到o(1)的计算复杂度。
def __init__(self):
self.stack1=[]
self.stack2=[]
def push(self, node):
# write code here
self.stack1.append(node)
if not self.stack2 or node<self.stack2[-1]:
self.stack2.append(node)
else:
self.stack2.append(self.stack2[-1])
def pop(self):
# write code here
self.stack1.pop()
self.stack2.pop()
def top(self):
# write code here
return self.stack1[-1]
def min(self):
# write code here
return self.stack2[-1]
(三)滑动窗口的最大值
用栈的方式来处理最大值,最小值问题,计算复杂度能达到o(1)。
def maxInWindows(self , num: List[int], size: int) -> List[int]:
# write code here
if size>len(num) or size==0:
return None
queue_max = []
res = []
for i in range(len(num)):
# 只要当前值大于队尾的值,并且队列不为空,就一直弹出队尾
while queue_max != [] and num[i] > num[queue_max[-1]]:
queue_max.pop() # pop最后一个
queue_max.append(i)
# 先插入后弹出的方式,减少判断队列的时间
# 判断队首下标对应的元素是否已经滑出窗口
if i - queue_max[0] >= size:
queue_max.pop(0)
if i >= size -1:
res.append(num[queue_max[0]])
return res