單調棧及其應用
阿新 • • 發佈:2020-11-28
單調棧
關於單調棧的基本性質和簡單應用在線性表小結之佇列與棧已經做了比較詳細介紹,這裡主要針對單調棧在實際解決問題中的應用進行補充例舉與總結。
逛街
解題思路:
從左往右(1~n)單調遞減入棧,依次記錄棧中元素個數(ans[]),在從右往左(n~1)單調遞減入棧,依次累加棧中元素個數(ans[]),最後依次輸出結果。
#include <iostream> #include <stack> using namespace std; int main() { int n, num[100005] = {0}; int ans[100005] = {0}; stack<int> sta; cin >> n; for (int i = 1; i <= n; i++) { cin>>num[i]; } for (int i = 1; i <= n; i++) { ans[i] = sta.size() + 1; while (!sta.empty() && sta.top() <= num[i]) { sta.pop(); } sta.push(num[a]); }while (!sta.empty()) { sta.pop(); } for (int i = n; i > 0; i--) { ans[i] += sta.size(); while (!sta.empty() && sta.top() <= num[i]) { sta.pop(); } sta.push(num[i]); } for (int i = 1; i <= n; i++) { i == 1 || cout << ""; cout << ans[i]; } return 0; }