第一次听说单调栈是在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