首页 > 其他分享 >单调栈

单调栈

时间:2023-04-03 23:14:58浏览次数:23  
标签:minn int top pop push 单调

第一次听说单调栈是在cf上看到的,当时看的糊里糊涂,正好算法进阶指南上有单调栈,赶紧看看

cf题:https://codeforces.com/contest/1795/problem/E

单调栈,顾名思义,栈内的元素单调排序,当题目满足某些性质时,单调栈的先进后出性质显得尤为重要,滑动窗口模拟优先队列便是这样。

书上的第一道例题就让我大开眼界

 

 如何在保留原有数据进出顺序的同时,做到O(1)的获取最小值

很简单,单开一个栈b,保存a中以栈底为开头的每段数据的最小值

每当push进一个新的数,只要和b栈顶的数比较,如果小于等于它,就push,大于的话,就不管

而当要pop掉a的栈顶时,只需要比较a的栈顶和b的栈顶是否一样,如果一样,则b也pop

有一个细节:push时,比对关系有等于,为的是防止出现一个极小的数字重复出现

 

还有一个只用一个栈和一个变量的方法,贴个链接:

https://www.acwing.com/solution/content/6721/

 

补个代码

class MinStack {
public:
    /** initialize your data structure here. */
    stack <int> a;
    int minn;
    MinStack() {
        
    }
    
    void push(int x) {
        if(a.empty())
            a.push(x),minn = x;
        else 
        {
            a.push(x - minn);
            minn = min(x, minn);
        }
    }
    
    void pop() {
        if(a.top() < 0)
            minn -= a.top();
        a.pop();
        
    }
    
    int top() {
        if(a.size() == 1) return minn;
        else 
        {
            if(a.top() >= 0) return a.top() + minn;
            else return minn;
        }
    }
    
    int getMin() {
        return minn;
    }
};
View Code

 

标签:minn,int,top,pop,push,单调
From: https://www.cnblogs.com/xxx3/p/17284831.html

相关文章

  • 算法随想Day51【单调栈】| LC739-每日温度、LC496-下一个更大元素Ⅰ
    LC739.每日温度vector<int>dailyTemperatures(vector<int>&temperatures){intsize=temperatures.size();vector<int>result(size,0);vector<int>sta;sta.push_back(0);for(inti=1;i<size;++i){......
  • 算法随想Day52【单调栈】| LC503-下一个更大元素Ⅱ、LC42-接雨水
    LC503.下一个更大元素Ⅱ对于“每日温度”,相当于对nums数组,进行了两次遍历。用i%size所得余数作为下标,且循环的圈数为size*2vector<int>nextGreaterElements(vector<int>&nums){intsize=nums.size();vector<int>result(size,-1);vector<int>sta;......
  • 算法随想Day53【单调栈】| LC84-柱状图中最大的矩形
    intlargestRectangleArea(vector&heights){intresult=0;stackst;heights.insert(heights.begin(),0);heights.push_back(0);st.push(0);for(inti=1;i<heights.size();i++){if(heights[i]>heights[st.top()]){st.push(......
  • 单调栈
    单调栈是一种和单调队列类似的数据结构。单调队列主要用于解决滑动窗口问题,单调栈则主要用于解决NGE问题(NextGreaterElement),也就是,对序列中每个元素,找到下一个比它大的元素。(当然,“下一个”可以换成“上一个”(对于序列的正序、反序遍历),“比它大”也可以换成“比他小”,原理不变。......
  • 手写单调队列
    单调队列的功能单调队列,这个神奇的\(O(n)\)算法,经常有人把他和优先队列混为一谈,但实际上两者大相径庭。总的来说,单调队列有两个功能:可以从队头/队尾出队,而且出入顺序正常。可以按照增/减/自定义比较方式求出队中最值。单调队列有一个很著名的\(Sliding\)\(Window\)......
  • 【单调队列】LeetCode 239. 滑动窗口最大值
    题目链接239.滑动窗口最大值思路单调队列的使用方法,可以参考【单调队列】LeetCode面试题59-II.队列的最大值在本题中将滑动窗口的移动看作往队列中放数和取数的过......
  • 单调栈
    参考:https://www.bilibili.com/video/BV1Y441117gR/?from=search&seid=9796499757209042214&spm_id_from=333.337.0.0&vd_source=46d50b5d646b50dcb2a208d3946b1598设计......
  • POJ-2559-Largest Rectangle in a Histogram-DP或者单调栈
    ProblemE LargestRectangleinaHistogram TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):2498......
  • 函数性质与决策单调性
    一些函数性质:一次函数:最大值和最小值在\(x\)的最大值或最小值取到。(引申)反比例函数:最大值和最小值在\(\cfrac{1}{x}\)的最大值或最小值取到。奇/偶函数:对称性。单......
  • 单调队列
       重点:将队列中没有用的元素删除。如果在窗口中存在i<j,ai>aj,那么在窗口向右移动的过程中,只要aj存在,那么ai就永远不可能成为最小值。应该被移除。因此,当窗口移动......