LeetCode 84
https://leetcode.cn/problems/largest-rectangle-in-histogram/description/
难度:困难
高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/
单调栈。h = height[i],left[i] 表示在 i 左侧小于 h 的最近元素下标,right[i] 表示在 i 右侧小于等于 h 的最近元素下标。以 h 为高度的矩形的最大面积为 height[i] * (right[i] - left[i] - 1)。
两次遍历,在计算 left 的过程中,如果栈顶元素 ≥ heights[i],那么 i 就是栈顶元素的 right。
时间复杂度:O(n),其中 n 为 heights 的长度。每个元素入栈出栈各至多一次,所以二重循环是 O(n) 的。
空间复杂度:O(n)。
class Solution {
public:
int largestRectangleArea(vector<int> &heights) {
int n = heights.size();
vector<int> left(n, -1);
vector<int> right(n, n);
stack<int> st;
for (int i = 0; i < n; i++) {
int h = heights[i];
while (!st.empty() && heights[st.top()] >= h) {
right[st.top()] = i;
st.pop();
}
if (!st.empty()) {
left[i] = st.top();
}
st.push(i);
}
int ans = 0;
for (int i = 0; i < n; i++) {
ans = max(ans, heights[i] * (right[i] - left[i] - 1));
}
return ans;
}
};