【唐叔学算法】第四天:单调栈-有序之美的奥秘

大家好,我是唐叔,今天要给大家带来的是单调栈算法的详细介绍。如果你对算法有研究,那么你一定知道单调栈在处理某些特定类型的问题时有着非常高的效率。本文将从单调栈的基本概念讲起,逐步深入到具体的应用场景,并通过实例来加深理解。希望通过这篇文章,你能对单调栈有一个全面的认识,并能够在解决实际问题时灵活运用。

单调栈是什么?

基本概念

单调栈是一种特殊的栈结构,它只允许元素单调递增或单调递减。具体来说,有两种类型的单调栈:

  1. 单调递增栈:栈内元素从栈底到栈顶是单调递增的。
  2. 单调递减栈:栈内元素从栈底到栈顶是单调递减的。

在单调栈中,新元素入栈时,会与栈顶元素进行比较,根据单调性的要求,可能会弹出一些元素,以保持栈的单调性。

应用场景

单调栈通常用于以下几种情况:

  • 问题涉及到元素的相对顺序、下标索引等。
  • 寻找每个元素右边第一个比它大/小的元素
  • 计算直方图中最大的矩形面积
  • 求解滑动窗口的最大值

如何使用单调栈

使用步骤
  1. 初始化一个空栈:用于存放元素或元素的索引。
  2. 遍历输入序列:对于每一个元素,执行如下操作:
    • 如果栈为空,则直接将当前元素(或其索引)压入栈。
    • 如果当前元素满足入栈条件(根据题目需求决定是单调递增还是单调递减),则将其压入栈。
    • 否则,持续弹出栈顶元素,直到满足入栈条件为止,在此过程中,可以根据需要更新答案。
  3. 处理剩余元素:遍历结束后,栈中可能还有剩余元素,根据具体问题处理这些元素。
注意事项
  • 栈中存储的既可以是实际的元素值,也可以是元素的索引,这取决于具体的题目需求。
  • 在处理边界情况时要特别小心,例如当栈为空时,可能需要特殊处理。

LeetCode实战

入门题目 - 496. 下一个更大元素 I

题目描述

nums1 中数字 x下一个更大元素 是指 xnums2 中对应位置 右侧第一个x 大的元素。

给你两个 没有重复元素 的数组 nums1nums2 ,下标从 0 开始计数,其中nums1nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j]下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素

解题思路

我们使用哈希表 map 存储每个元素及其下一个更大元素,使用单调递减栈 stack 存储遍历到的元素。遍历数组 nums2,当遇到一个更大的元素时,更新 map 并弹出栈顶元素。遍历数组 nums1,从 map 中获取每个元素的下一个更大元素。

Java代码实现
public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值