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 <= 105
0 <= heights[i] <= 104
-------------------------------------------
This is an excellent problem. Two difficulties in this problem:
- Forget to record the start_off
- Confuse with problem Leetcode 42 407 Trapping Rain Water I II 双指针
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
// Note: The Solution object is instantiated only once and is reused by each test case.
stack<int> S;
int i, sum = 0, cursum = 0;
height.push_back(0);
for (i = 0; i < height.size(); ++i) {
if (S.empty() || (!S.empty() && height[i] >= height[S.top()]))
S.push(i);
else {
int stackmax = S.top();
S.pop();
if (S.empty())
cursum = height[stackmax] * i;
else
cursum = height[stackmax] * (i - S.top() - 1);
if (cursum > sum)
sum = cursum;
--i;
}
}
return sum;
}
};
Python version:
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
l = len(heights)
max_area = 0
sta = []
for i in range(l):
start_off = i
while sta and heights[i] < sta[-1][0]:
prev_height, start_off = sta.pop()
max_area = max(max_area, prev_height*(i-start_off))
sta.append((heights[i],start_off))
while sta:
prev_height, start_off = sta.pop()
max_area = max(max_area, prev_height*(l-start_off))
return max_area