双向单调栈模板

本文探讨了双向单调栈这一数据结构,用于解决数组中查找特定条件的元素问题。通过示例代码详细解释了如何计算左右两侧的最小值下标,并列举了LeetCode上的相关题目,如LeetCode84、1576和907,帮助读者理解和运用此技巧。同时强调了在处理边界条件和结合前缀和枚举使用时的策略。
摘要由CSDN通过智能技术生成

前言:今日遇到了双向单调栈的题,这里放出模板和题目,以备之后使用


简单介绍:单调栈的初始目的就是求在一个方向上小于 (或小于等于) 自身的第一个元素的值 (或下标),而双端单调栈便是分别求左右两边。双向单调栈在使用时需要注意一些边界条件,同时配合 前缀和枚举 使用会有奇效。(不信你做题看看)


题目:LeetCode 84LeetCode 1576LeetCode 907

代码模板

vector<int> L(n), R(n);

// Calculate the array L
{
    stack<int> s;
    for(int i = 0; i < n; ++i){
        while(s.size() and arr[i] <= arr[s.top()]){
            s.pop();
        }
        L[i] = s.empty() ? -1 : s.top();
        s.push(i);
    }
}

// Calculate the array R
{
    stack<int> s;
    for(int i = n - 1; i >= 0; --i){
        while(s.size() and arr[i] <= arr[s.top()]){
            s.pop();
        }
        R[i] = s.empty() ? n : s.top();
        s.push(i);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值