单调栈
关于单调栈的基本性质和简单应用在线性表小结之队列与栈已经做了比较详细介绍,这里主要针对单调栈在实际解决问题中的应用进行补充例举与总结。
逛街
解题思路:
从左往右(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; }