栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
示例1:
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
示例2:
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。
代码:
class Solution:
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
if len(pushed) == 0:
return True
stack = []
ind = 0
for i in range(len(pushed)):
stack.append(pushed[i])
while stack[-1] == popped[ind]:
stack.pop()
ind += 1
if len(popped) == ind:
return True
if len(stack) == 0:
break
return False
利用列表模拟出入栈,遍历push栈,只要有符合pop栈的pop栈立刻出栈首,虽然两个循环但入栈出栈列表只会遍历一遍,所以时间复杂度O(n),空间复杂度O(n)。
弹出序列和从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
代码:
class Solution:
def levelOrder(self, root: TreeNode) -> List[int]:
res = []
queue = []
if root: queue.append(root)
while queue:
tmp = queue.pop(0)
res.append(tmp.val)
if tmp.left: queue.append(tmp.left)
if tmp.right: queue.append(tmp.right)
return res
用队列实现层序遍历即可,时间复杂度O(n),空间复杂度O(n)