数据结构:单调栈
單調棧和單調隊列都是比較廢物的
單調棧的棧具有單調性,可以找到從左或者從右遍歷第一個比當前元素小或者比當前元素大的元素的位置
首先給出維護單調棧的代碼
while(s.size()&&a[s.top()]>=a[i])s.pop();可以看出這是一個單調遞增棧,棧頂元素一定是最小的
我們這里用一個數組來記錄每一個元素在向左遍歷的時候,第一個比當前元素大的元素額位置
如果這個時候的棧是空的,說明左邊沒有比當前元素更大的元素了,否則,第一個比當前元素大的元素一定是棧頂元素
這里采用和單調隊列中類似的處理辦法,還是存的是下標
if(s.empty())l[i]=0;elsel[i]=s.top();s.push(i);然后我們給出完整的代碼,相比較于單調隊列,更加簡單,但是用的時候卻很神奇
1 #include<iostream> 2 #include<stack> 3 using namespace std; 4 const int maxn=100005; 5 int n; 6 int a[maxn]; 7 int l[maxn]; 8 stack<int> s; 9 10 int main() 11 { 12 cin>>n; 13 for(int i=1;i<=n;i++) 14 cin>>a[i]; 15 for(int i=1;i<=n;i++) 16 { 17 while(s.size()&&a[s.top()]>=a[i]) 18 s.pop(); 19 if(s.empty()) 20 l[i]=0; 21 else 22 l[i]=s.top(); 23 s.push(i); 24 } 25 for(int i=1;i<=n;i++) 26 cout<<l[i]<<" "; 27 return 0; 28 }?
轉載于:https://www.cnblogs.com/aininot260/p/9304673.html
總結
- 上一篇: springboot入门_shiro
- 下一篇: redhat_yum install