最近了解了一下单调栈这玩意,然后做下笔记。就以一个经典的问题来说吧。
https://www.nowcoder.com/questionTerminal/13ba51c3fec74b58bbc8fa8c3eedf877
这题一开始写来写去一直写挂了,后来网上看了下大佬的解法自己也学会了。
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[100000];
int st[100000],head;
int l[100000],r[100000];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
while(head&&a[st[head]]>=a[i]){
head--;
}
l[i]=head?st[head]+1:1;
st[++head]=i;
}
head=0;
for(int i=n;i>=1;i--){
while(head&&a[st[head]]>=a[i]){
head--;
}
r[i]=head?st[head]:n;
st[++head]=i;
}
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,(r[i]-l[i])*a[i]);
}
cout<<ans<<endl;
return 0;
}
看到网上很多题解都是leetcode模式的题解,实在看着不舒服,自己写了份。