84. Largest Rectangle in Histogram
Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
Above is a histogram where width of each bar is 1, given height =
[2,1,5,6,2,3]
.
The largest rectangle is shown in the shaded area, which has area =
10
unit.
Example:
Input: [2,1,5,6,2,3]
Output: 10
// Brute force with pruning
int largestRectangleArea(vector<int>& heights) { // time: O(n^2); space: O(1)
int res = 0;
for (int i = 0; i < heights.size(); ++i) {
if (i + 1 < heights.size() && heights[i] <= heights[i + 1]) continue;
int minH = heights[i];
for (int j = i; j >= 0; --j) {
minH = min(minH, heights[j]);
res = max(res, minH * (i - j + 1));
}
}
return res;
}
// Monotone Stack
int largestRectangleArea(vector<int>& heights) { // time: O(n); space: O(n)
int res = 0;
stack<int> st;
heights.push_back(0);
for (int i = 0; i < heights.size(); ++i) {
if (st.empty() || heights[st.top()] < heights[i]) {
st.push(i);
} else {
int cur = st.top(); st.pop();
res = max(res, heights[cur] * (st.empty() ? i : i - st.top() - 1));
--i;
}
}
return res;
}
// Monotonic Stack
int largestRectangleArea(vector<int>& heights) { // time: O(n); space: O(n)
int res = 0;
stack<int> st;
heights.push_back(0);
for (int i = 0; i < heights.size(); ++i) {
while (!st.empty() && heights[st.top()] >= heights[i]) {
int cur = st.top(); st.pop();
res = max(res, heights[cur] * (st.empty() ? i : i - st.top() - 1));
}
st.push(i);
}
return res;
}
Last updated
Was this helpful?