题目描述
思路解析动画文字版
记住这句,下面每一帧都在演它。
轮到 nums2[0] = 2,先看它能不能把栈里的小数顶出去。
没人能再被它弹了(栈顶≥它或栈空),它自己入栈,递减栈结构保持。
轮到 nums2[1] = 1,先看它能不能把栈里的小数顶出去。
没人能再被它弹了(栈顶≥它或栈空),它自己入栈,递减栈结构保持。
轮到 nums2[2] = 5,先看它能不能把栈里的小数顶出去。
当前数比栈顶大:栈顶等到了它的下一个更大,弹出并记进哈希。继续看还能不能弹。
当前数比栈顶大:栈顶等到了它的下一个更大,弹出并记进哈希。继续看还能不能弹。
没人能再被它弹了(栈顶≥它或栈空),它自己入栈,递减栈结构保持。
轮到 nums2[3] = 6,先看它能不能把栈里的小数顶出去。
当前数比栈顶大:栈顶等到了它的下一个更大,弹出并记进哈希。继续看还能不能弹。
没人能再被它弹了(栈顶≥它或栈空),它自己入栈,递减栈结构保持。
轮到 nums2[4] = 3,先看它能不能把栈里的小数顶出去。
没人能再被它弹了(栈顶≥它或栈空),它自己入栈,递减栈结构保持。
轮到 nums2[5] = 8,先看它能不能把栈里的小数顶出去。
当前数比栈顶大:栈顶等到了它的下一个更大,弹出并记进哈希。继续看还能不能弹。
当前数比栈顶大:栈顶等到了它的下一个更大,弹出并记进哈希。继续看还能不能弹。
没人能再被它弹了(栈顶≥它或栈空),它自己入栈,递减栈结构保持。
轮到 nums2[6] = 4,先看它能不能把栈里的小数顶出去。
没人能再被它弹了(栈顶≥它或栈空),它自己入栈,递减栈结构保持。
轮到 nums2[7] = 7,先看它能不能把栈里的小数顶出去。
当前数比栈顶大:栈顶等到了它的下一个更大,弹出并记进哈希。继续看还能不能弹。
没人能再被它弹了(栈顶≥它或栈空),它自己入栈,递减栈结构保持。
扫描结束,栈里残留的 7 右边没有更大的数,它的下一个更大记 -1。
扫描结束,栈里残留的 8 右边没有更大的数,它的下一个更大记 -1。
边界先想清。
两个高频追问。
参考代码
def nextGreaterElement(nums1, nums2): greater, stack = {}, [] for x in nums2: while stack and stack[-1] < x: greater[stack.pop()] = x # 栈顶的下一个更大 = x stack.append(x) return [greater.get(v, -1) for v in nums1]复杂度
- 时间:O(n+m),nums2 每个数最多入栈出栈一次 + 查 nums1
- 空间:O(n),哈希表 + 单调栈
易错点
面试追问把动画讲成自己的话
追问如果是环形数组(LC503)怎么办?
追问为什么单调栈能摊还到 O(n)?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
棒球比赛
LeetCode 682 · 简单 · 沿着 栈套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题