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.
For example,
Given height = [2,1,5,6,2,3]
,
return 10
.
This is an excellent problem.
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 squash_stack(self, stack, threshold):
max_area = 0
rightmost_height, rightmost_pos = stack[-1][0], stack[-1][1]
cur_height, cur_pos = rightmost_height, rightmost_pos
while (stack and stack[-1][0] > threshold):
cur_height, cur_pos = stack[-1][0], stack[-1][1]
max_area = max(max_area, cur_height * (rightmost_pos-cur_pos+1))
stack.pop()
stack.append([threshold, cur_pos])
return max_area
def largestRectangleArea(self, heights):
stack = []
hlen = len(heights)
max_area = 0
if (hlen == 0):
return max_area
for i in range(0, hlen):
if (stack and stack[-1][0] > heights[i]):
max_area = max(max_area, self.squash_stack(stack, heights[i]))
stack.append([heights[i], i])
max_area = max(max_area, self.squash_stack(stack, 0))
return max_area
s = Solution()
y = s.largestRectangleArea([5,4,4,6,3,2,9,5,4,8,1,0,0,4,7,2])
print(y)