用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
class Solution1:
def __init__(self):
self.s1 = []
self.s2 = []
def push(self, node):
#入队,跟S2状态无关
self.s1.append(node)
def pop(self):
# 出队,要分S2空与否;
#S2空,将S1中所有元素弹出到S2,再对S2弹出一个。
if self.s2 == []:
while self.s1:
self.s2.append(self.s1.pop())
return self.s2.pop()
# 当S2不空,直接对S2弹出
return self.s2.pop()
if __name__ == '__main__':
s = Solution1()
s.push([1,2,3])
print s.pop()
[1, 2, 3]
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数
class Solution2:
def __init__(self):
self.stack = []
self.minstack = []
def push(self, node):
# write code here
self.stack.append(node)
if len(self.minstack)==0 or node<=self.minstack[-1]:
self.minstack.append(node)
def pop(self):
# write code here
if self.stack[-1]==self.minstack[-1]:
self.minstack.pop(-1)
self.stack.pop(-1)
def top(self):
# write code here
return self.stack[-1]
def min(self):
# write code here
return self.minstack[-1]
if __name__ == '__main__':
s = Solution2()
s.push([3])
print s.min()
s.push([4])
print s.min()
s.push([2])
print s.min()
[3]
[3]
[2]
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
引入辅助栈存储当前序列,弹出时分两种情况
# -*- coding:utf-8 -*-
class Solution:
def IsPopOrder(self, pushV, popV):
# write code here
if not pushV or len(pushV)!= len(popV):
return False
stack = []
for i in pushV:
stack.append(i)
while len(stack) and stack[-1] == popV[0]:
stack.pop() # 弹出最后一个
popV.pop(0) # 弹出第一个
if len(stack):
return False
return True
if __name__ == '__main__':
s = Solution()
print s.IsPopOrder([1,2,3,4,5],[4,3,5,1,2])
False
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
遍历列表,用切片获取窗口,用内置函数max()获取窗口内最大值
class Solution:
def maxInWindows(self, num, size):
# write code here
if not num or size==0:
return []
res = []
for i in range(len(num)-size+1):
res.append(max(num[i:i+size]))
return res
思路:滑动窗口应当是队列,但为了得到滑动窗口的最大值,队列序可以从两端删除元素,因此使用双端队列。
原则:
对新来的元素k,将其与双端队列中的元素相比较
1)后面比k小的,直接移出队列(因为不再可能成为后面滑动窗口的最大值了!),也保证了队首为最大。
2)判断队首X是否已不在窗口之内,不在了,直接移出队列。
队列的第一个元素是滑动窗口中的最大值。
# -*- coding:utf-8 -*-
from collections import deque
class Solution:
def maxInWindows(self, num, size):
# write code here
if not num or size==0:
return []
d = deque()
res = []
for i in range(len(num)):
#从后面依次弹出队列中比当前num值小的元素,同时也能保证队列首元素为当前窗口最大值下标
while(len(d) and num[d[-1]]<=num[i]):
d.pop()
#判断队首X是否已不在窗口之内
while(len(d) and i-d[0]+1>size):
d.popleft()
d.append(i)
#当遍历了size个元素后,开始插入最大值
if (i+1>=size):
res.append(num[d[0]])
return res