用途:用于求一个数组中每个数,左右两边 大于或小于且离它最近的数,时间复杂度o(n)实现
如:求一个数组中的数,左右两边离它最近且大于它的数
实现方式:以求两边最近的大于它的数为例
- 保持一个单调栈结构,栈底到栈顶数依次递减
- 新加入的数如果大于栈顶,栈顶弹出,弹出元素左边为现在的栈顶,右边为使他弹出的元素
- 新加入的数等于栈顶,栈顶元素的个数加一
例题:leetcode84
分析:对于每个矩形,找到左右两边最近的比它小的数,就得到了以这个矩形为高,宽最大能为多少
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
if(heights.empty()) return 0;
stack<int> s;
int maxArea = INT_MIN;
int hight, left, width, curArea;
for(int i = 0; i < heights.size(); i++){
while(!s.empty() && heights[i] <= heights[s.top()]){
hight = heights[s.top()];
s.pop();
left = s.empty() ? -1 : s.top();
width = i - left - 1;
curArea = width * hight;
maxArea = max(curArea, maxArea);
}
s.push(i);
}
//处理遍历完后,栈中的数据
while(!s.empty()){
hight = heights[s.top()];
s.pop();
left = s.empty() ? -1 : s.top();
width = heights.size() - left - 1;
curArea = width * hight;
maxArea = max(curArea, maxArea);
}
return maxArea;
}
};