题目描述
思路解析动画文字版
记住这条贪心:能弹就立刻弹。下面每一帧都在套它。
pushed=[1,2,3,4,5,6,7,8,9],要按这个顺序压栈;popped=[3,2,4,6,5,9,8,7,1] 是期望的弹出顺序。从左边第一个开始压。
压入 1,栈顶现在是 1。看它等不等于下一个该弹的 3。
压入 2,栈顶现在是 2。看它等不等于下一个该弹的 3。
压入 3,栈顶现在是 3。看它等不等于下一个该弹的 3。
栈顶 3 == 该弹的 3,弹出!下一个该弹 2,当前栈顶 2。
栈顶 2 == 该弹的 2,弹出!下一个该弹 4,当前栈顶 1。
压入 4,栈顶现在是 4。看它等不等于下一个该弹的 4。
栈顶 4 == 该弹的 4,弹出!下一个该弹 6,当前栈顶 1。
压入 5,栈顶现在是 5。看它等不等于下一个该弹的 6。
压入 6,栈顶现在是 6。看它等不等于下一个该弹的 6。
栈顶 6 == 该弹的 6,弹出!下一个该弹 5,当前栈顶 5。
栈顶 5 == 该弹的 5,弹出!下一个该弹 9,当前栈顶 1。
压入 7,栈顶现在是 7。看它等不等于下一个该弹的 9。
压入 8,栈顶现在是 8。看它等不等于下一个该弹的 9。
压入 9,栈顶现在是 9。看它等不等于下一个该弹的 9。
栈顶 9 == 该弹的 9,弹出!下一个该弹 8,当前栈顶 8。
栈顶 8 == 该弹的 8,弹出!下一个该弹 7,当前栈顶 7。
栈顶 7 == 该弹的 7,弹出!下一个该弹 1,当前栈顶 1。
栈顶 1 == 该弹的 1,弹出!弹出序列走完,栈已空。
全部压完、栈正好空、popped 全弹出 ⇒ 这是一个合法的弹出序列,返回 true。(若结束时栈非空,则返回 false)
边界先想清楚。
两个高频追问。
参考代码
def validateStackSequences(pushed, popped): st, j = [], 0 for x in pushed: st.append(x) while st and j < len(popped) and st[-1] == popped[j]: st.pop(); j += 1 return not st复杂度
- 时间:O(n),每个元素至多压一次、弹一次
- 空间:O(n),模拟栈最多装下全部元素
易错点
面试追问把动画讲成自己的话
追问怎么证明这个贪心是对的?
追问如果 pushed 和 popped 元素不是同一组数怎么办?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
按递增顺序显示卡牌
LeetCode 950 · 中等 · 沿着 栈套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题