单调栈的性质
单调栈是一种特殊的栈,特殊之处在于栈内的元素都保持一个单调性。
假设下图是一个栈内元素的排列情况(单调递增的栈):
此时插入情况有两种:
(1)插入元素大于栈顶元素:
因为7 > 6,满足栈内元素单调递增的性质,所以可以直接插入7到栈顶
(2)当插入元素小于栈顶元素的时候,当插入3的时候,需要将栈顶的6,4弹出,在插入,例如:
功能
利用单调栈可以找出从左/右遍历第一个比它小/大的元素的位置
例如说:
现在有一个数组a[4] = {5,7,3,4},要你找出每一个元素左边最靠近它的最小元素的位置(下标+1),如果没有元素比它小,则输出0
此时我们会想到,从每一个数字开始想左边遍历,这是一个朴素的算法,我们就不再多说了。
我们要说的是怎么样利用单调栈来解决该问题
1.设计一个数组res[4],来保存结果
2.开一个栈,这个栈的性质是,当栈为空的时候,将对应的res[i] = 0;当栈顶元素是从左开始,输入的数中最小的那个的下标,如果进栈的元素小于或者等于a[栈顶元素],则输出0;如果大于,则输出栈顶元素+1。
下面上代码:
#include<iostream>
#include<stack>
using namespace std;
int main() {
//n表示要找的总数
int n; cin >> n;
//a用来保存输入的数据
int* a = new int[n];
//res_left用来保存对应的结果
int* res_left = new int[n];
stack<int>s;
for (int i = 0; i < n; i++)cin >> a[i];
//找出a[i]左边和右边最近的一个比他小的值的下标
for (int i = 0; i < n; i++) {
while (!s.empty() && a[i] <=