C++ 算法学习——1.8 单调栈算法

单调栈(Monotonic Stack)是一种在解决一些数组或者链表相关问题时非常有用的数据结构和算法。在C++中,单调栈通常用于解决一些需要快速找到元素左右第一个比当前元素大或小的问题。

  1. 定义

    • 单调栈实际上是一个栈,但是与普通栈不同的是,单调栈中的元素是按照单调递增或者单调递减的顺序存放的。
  2. 应用

    • 单调栈通常用于解决一些数组或链表相关的问题,例如找到每个元素左边或右边第一个比当前元素大或小的元素等。
    • 优化大规模的问题,以空间换时间。
  3. 实现

    • 在C++中,可以使用STL中的stack来实现单调栈。在处理问题时,通常需要遍历数组或链表,维护一个递增或递减的栈结构。
  4. 算法步骤

    • 遍历数组元素,对于每个元素:
      • 如果栈为空,将当前元素下标入栈。
      • 如果当前元素大于栈顶元素,出栈直到栈为空或者栈顶元素大于当前元素,然后将当前元素入栈。
      • 如果当前元素小于等于栈顶元素,直接将当前元素下标入栈。
  5. 时间复杂度

    • 单调栈算法的时间复杂度通常为O(n),其中n是数组或链表的长度。

P1. 洛谷p2866bad hair days

cpp 复制代码
#include<iostream>
#include<stack>
using namespace std;
long long ans=0;

int main()
{
    int nums;cin>>nums;
    stack<int> ox;
    for(int i=1;i<=nums;i++)
    {
        int p;cin>>p;
        if(ox.empty()) ox.push(p);
        else
        {
            if(p<ox.top()) {ans+=ox.size();ox.push(p);continue;}
            while(!ox.empty()&&p>=ox.top()) ox.pop();
            ans+=ox.size();
            ox.push(p);
        }
    }
    cout<<ans;
    return 0;
}
相关推荐
梭七y10 小时前
【力扣hot100题】(131)排序链表
算法·leetcode·链表
副露のmagic10 小时前
更弱智的算法学习 day18
学习·算法
byzh_rc10 小时前
[数字信号处理-入门] 采样定理
算法·matlab·信号处理
想进个大厂10 小时前
代码随想录day6哈希表
算法·leetcode·散列表
江苏世纪龙科技10 小时前
科技课堂遇上“数字孪生”,让智能网联教学更鲜活~
学习
风清扬_jd10 小时前
libcurl 开启https一键编译指南【MT方式】
c++·https·curl
好奇龙猫11 小时前
【人工智能学习-AI-MIT公开课第 16 讲:支持向量机(SVM)】
人工智能·学习·支持向量机
less is more_093011 小时前
文献学习——计及分时电价的电缆配电网多时段二阶段有功与无功协调快速鲁棒优化调度方法
笔记·学习·算法
醇氧11 小时前
【teambition 二开】TB JSAPI 学习
学习·teambition
进击的小头11 小时前
18_C语言算法面试与进阶:高频算法题实战与学习路线规划
c语言·算法·面试