一.定义
特殊的栈,它的特点是栈中的元素保持单调性。具体来说,可以分为单调递增栈和单调递减栈两种类型。
单调递增栈是指栈中的元素从栈底到栈顶逐渐递增。当一个元素要入栈时,如果它比栈顶元素小,就将栈顶元素弹出,直到栈顶元素比它小为止。这样可以保证栈中的元素始终保持单调递增的状态。
单调递减栈则是栈中的元素从栈底到栈顶逐渐递减。当一个元素要入栈时,如果它比栈顶元素大,就将栈顶元素弹出,直到栈顶元素比它大为止。这样可以保证栈中的元素始终保持单调递减的状态。
单调栈常用于解决一些与区间相关的问题,例如找到每个元素左侧/右侧第一个比它大/小的元素等。这类问题可以通过维护一个单调栈来解决,具体实现方式与单调栈的类型有关。
单调栈是一种非常高效的数据结构,时间复杂度通常为 O(n)。它在算法竞赛和工程开发中都有广泛的应用。
二.经典例题一
一.题目
大家排队,都面向右边。大家只能向右看。从左边数第一位开始,如果第2位同学比他低,他能看到该同学的头型,如果高就看不到了,后面的也看不到。输入n个人,再输入n个人的身高。求所有人能看到其他人的头型总数有多少。(1<n<10^6) 输入: 共两行。第一行一个整数n表示总人数。 第二行依次输入n个人的身高。 输出: 一个整数,表示所有人能看到其他人的头型总数 输入示例: 6 10 3 7 4 12 2 输出示例: 5
二.图解示意
三.暴力解法(O(
))
#include<bits/stdc++.h>
using namespace std;
int a[1001];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int sum=0;
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(a[i]>a[j]) sum++;
else break;
}
}
cout<<sum<<endl;
return 0;
}
四.单调栈解法(O(n))
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n,ans=0;
stack<long long> s;
cin>>n;
while(n--){
long long p;
cin>>p;
while(!s.empty()&&()<=p){
s.pop();
}
ans+=s.size();
s.push(p);
}
cout<<ans;
return 0;
}