• 数据结构:单调栈


    单调栈和单调队列都是比较废物的

    单调栈的栈具有单调性,可以找到从左或者从右遍历第一个比当前元素小或者比当前元素大的元素的位置

    首先给出维护单调栈的代码

            while(s.size()&&a[s.top()]>=a[i])
                s.pop();

    可以看出这是一个单调递增栈,栈顶元素一定是最小的

    我们这里用一个数组来记录每一个元素在向左遍历的时候,第一个比当前元素大的元素额位置

    如果这个时候的栈是空的,说明左边没有比当前元素更大的元素了,否则,第一个比当前元素大的元素一定是栈顶元素

    这里采用和单调队列中类似的处理办法,还是存的是下标

    if(s.empty())
                l[i]=0;
            else
                l[i]=s.top();
            s.push(i);

    然后我们给出完整的代码,相比较于单调队列,更加简单,但是用的时候却很神奇

     1 #include<iostream>
     2 #include<stack>
     3 using namespace std;
     4 const int maxn=100005;
     5 int n;
     6 int a[maxn];
     7 int l[maxn];
     8 stack<int> s;
     9 
    10 int main()
    11 {
    12     cin>>n;
    13     for(int i=1;i<=n;i++)
    14         cin>>a[i];
    15     for(int i=1;i<=n;i++)
    16     {
    17         while(s.size()&&a[s.top()]>=a[i])
    18             s.pop();
    19         if(s.empty())
    20             l[i]=0;
    21         else
    22             l[i]=s.top();
    23         s.push(i);
    24     }
    25     for(int i=1;i<=n;i++)
    26         cout<<l[i]<<" ";
    27     return 0;
    28 }
  • 相关阅读:
    PowerDesigner通过SQL文件,反向生成模型
    跨域请求设置
    SSO单点登录与登出
    jwt使用
    git概念理解
    Slf4j MDC机制
    ASP.NET Core依赖注入最佳实践,提示&技巧
    EFCore数据库迁移命令整理
    RSA加密的使用
    CocoaPods 安装的第三方删除
  • 原文地址:https://www.cnblogs.com/aininot260/p/9304673.html
Copyright © 2020-2023  润新知