非常好的一道力扣
核心思想:
- 单调栈中最小元素表示从0到R的最低水平线
/*
* @lc app=leetcode id=84 lang=cpp
*
* [84] Largest Rectangle in Histogram
*/
// @lc code=start
class Solution {
public:
// 单调栈的思路太牛逼了。。。。。最大复杂度O(2N)
// 核心思想:在单调栈不满足时,弹栈来取高度。
// 单调栈中最低元素,其意义为保存从0到i的最低高度,
// 只要最低元素弹出了,则从0到i一定满足该高度
int largestRectangleArea(vector<int>& heights) {
int N = heights.size();
heights.push_back(0); // 保证最后一定会全处理
stack<int> s; // 单调栈
int ans = 0;
int R = 0; // 右开区间
int L = 0; // 左开区间
int H = 0;
while(R <= N){
if(s.empty() || heights[R] > heights[s.top()]) s.push(R++);
else{
H = heights[s.top()];
s.pop();
L = s.empty()?-1:s.top();
ans = max(ans,H*(R-L-1));
}
}
return ans;
}
};
// @lc code=end