单调栈-原理与应用
单调栈---顾名思义,栈,且是单调的-单调递增或递减。
该算法模型能用来解决一类特定的问题,找该位置(左边和右边距离最近的比其大或比其小的元素)。
典型的问题有:下一个更大元素I、II,接雨水,最大矩形,柱状图最大矩阵等。
代码具有典型的套路,下面贴出接雨水的代码:
1 int trap(vector<int>& height) { 2 int res = 0; 3 stack<int> s; 4 int sz = height.size(); 5 6 for (int i = 0; i < sz; ++i) { 7 while (!s.empty() && height[s.top()] < height[i]) { 8 int t = s.top(); 9 s.pop(); 10 if (s.empty()) { 11 break; 12 } 13 //int left = s.top(); 14 res += (min(height[s.top()], height[i]) - height[t]) * (i - s.top() - 1); 15 } 16 s.push(i); 17 } 18 19 return res; 20 }
多做,多刷,多想,理解方能随机应变。
牢记套路模板。