Given an array of integers heights representing the histogram's bar height where the width of each bar is 1, return the area of the largest rectangle in the histogram.
Example 1:
Input: heights = [2,1,5,6,2,3] Output: 10 Explanation: The above is a histogram where width of each bar is 1. The largest rectangle is shown in the red area, which has an area = 10 units.
Example 2:
Input: heights = [2,4] Output: 4
Constraints:
1 <= heights.length <= 1050 <= heights[i] <= 104class Solution {
public:
int largestRectangleArea(vector<int>& height) {
if (height.empty() || height.size() == 0) {
return 0;
}
int lessFromLeft[height.size()]; // idx of the first bar the left that is lower than current
int lessFromRight[height.size()]; // idx of the first bar the right that is lower than current
lessFromRight[height.size()-1] = height.size();
lessFromLeft[0] = -1;
for (int i = 1; i < height.size(); i++) {
int p = i - 1;
while (p >= 0 && height[p] >= height[i]) {
p = lessFromLeft[p];
}
lessFromLeft[i] = p;
}
for (int i = height.size() - 2; i >= 0; i--) {
int p = i + 1;
while (p < height.size() && height[p] >= height[i]) {
p = lessFromRight[p];
}
lessFromRight[i] = p;
}
int maxArea = 0;
for (int i = 0; i < height.size(); i++) {
maxArea = max(maxArea, height[i] * (lessFromRight[i] - lessFromLeft[i] - 1));
}
return maxArea;
}
};