资讯详情

资讯详情

LeetCode 496题解析:单调栈与哈希表应用

1. 题目背景与核心需求LeetCode 496题下一个更大元素 I是单调栈算法的经典练习题。题目给定两个没有重复元素的数组nums1和nums2其中nums1是nums2的子集。要求找出nums1中每个元素在nums2中对应位置的右侧第一个比它大的元素如果不存在则输出-1。这个题目看似简单但考察了两个重要知识点哈希表快速查找能力单调栈处理下一个更大元素类问题的技巧2. 解题思路分析2.1 暴力解法分析最直观的解法是双重循环遍历nums1中的每个元素在nums2中找到对应元素的位置从该位置开始向右查找第一个更大的元素时间复杂度O(n^2)空间复杂度O(1)。这种方法在数据量大时性能较差。2.2 优化思路观察到题目要求下一个更大元素这提示我们可以使用单调栈先预处理nums2用单调栈找到每个元素的下一个更大元素将结果存入哈希表方便nums1快速查询这样可以将时间复杂度优化到O(n)空间复杂度O(n)。3. 单调栈实现详解3.1 单调栈工作原理单调栈是一种特殊的栈它保持栈内元素单调递增或递减。对于下一个更大元素问题我们使用单调递减栈stack [] for num in nums: while stack and num stack[-1]: # 找到了stack[-1]的下一个更大元素num stack.pop() stack.append(num)3.2 本题具体实现步骤初始化一个空栈和空字典存储结果遍历nums2当栈不为空且当前元素大于栈顶元素时栈顶元素的下一个更大元素就是当前元素将这对关系存入字典弹出栈顶元素将当前元素压入栈遍历nums1从字典中查询结果4. Python代码实现def nextGreaterElement(nums1, nums2): stack [] mapping {} for num in nums2: while stack and num stack[-1]: mapping[stack.pop()] num stack.append(num) # 栈中剩余元素没有下一个更大元素 while stack: mapping[stack.pop()] -1 return [mapping[num] for num in nums1]5. 复杂度分析与优化5.1 时间复杂度预处理nums2O(n)查询nums1O(m)总时间复杂度O(mn)5.2 空间复杂度栈和字典最多存储n个元素O(n)5.3 代码优化点可以边处理nums2边构建结果减少一次遍历使用collections.defaultdict简化字典操作优化后代码from collections import defaultdict def nextGreaterElement(nums1, nums2): stack [] mapping defaultdict(lambda: -1) for num in nums2: while stack and num stack[-1]: mapping[stack.pop()] num stack.append(num) return [mapping[num] for num in nums1]6. 常见问题与调试技巧6.1 常见错误栈空判断遗漏可能导致索引越界字典初始化不全部分元素可能没有对应的下一个更大元素输入边界条件处理空数组或单个元素数组6.2 调试建议打印栈和字典的中间状态使用小规模测试用例手动验证特别注意nums1和nums2元素顺序不同的情况6.3 测试用例设计# 常规情况 nums1 [4,1,2] nums2 [1,3,4,2] # 预期输出: [-1,3,-1] # nums1和nums2顺序不同 nums1 [2,4] nums2 [1,2,3,4] # 预期输出: [3,-1] # 边界情况 nums1 [] nums2 [1,2,3] # 预期输出: [] nums1 [1] nums2 [1] # 预期输出: [-1]7. 算法扩展与应用7.1 类似题目LeetCode 503.下一个更大元素II循环数组LeetCode 739.每日温度LeetCode 556.下一个更大元素III7.2 实际应用场景股票分析寻找下一个更高的价格点任务调度寻找下一个更适合执行的时机数据流处理实时查找数据流中的极值点7.3 算法变种前一个更小元素单调递增栈下一个更小元素单调递增栈前一个更大元素单调递减栈8. 个人刷题心得单调栈类题目有固定的套路关键在于识别问题是否属于下一个更大/小元素模式确定使用递增栈还是递减栈处理边界条件和特殊情况在实际刷题中建议先手写模拟栈的操作过程画图辅助理解元素进出栈的关系积累模板代码但不要死记硬背对于本题我最初尝试用暴力解法发现时间复杂度不理想后通过分析题目特征联想到单调栈。经过几次调试后总结出这个高效的解法。这种从简单解法出发逐步优化的过程是提高算法能力的有效方法。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →