Description:
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.
Analysis:
输入一个数组,表示柱状图的高度,求出这个柱状图中的最大矩形的面积。
面积=宽度*高度,关键在于求出宽度。
height[i],求出下标i的左右两边第一个小于height[i]的下标,也就是求出左右边界,然后根据左右边界计算出当前最大矩形的面积。
其实和leetcode739,每日温度解法类似。
这里使用辅助数据结构:递增栈/递减栈。
Solution1:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int ret = 0;
int n = heights.size();
vector<int> left(n, 0), right(n, 0);
stack<int> stk;
for (int i = 0; i < n; i ++) {
// left boundary: increase stack
while (!stk.empty() && heights[stk.top()] >= heights[i]) {
stk.pop();
}
left[i] = stk.empty() ? -1 : stk.top();
stk.push(i);
}
stk = stack<int>();
for (int i = n - 1; i >= 0; i --) {
// right boundary: decrease stack
while (!stk.empty() && heights[stk.top()] >= heights[i]) {
stk.pop();
}
right[i] = stk.empty() ? n : stk.top();
stk.push(i);
}
for (int i = 0; i < n; i ++) {
ret = max(ret, heights[i] * (right[i] - left[i] - 1));
}
return ret;
}
};
Solution2:
一次遍历,注意初始化right(n, n)
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int ret = 0;
stack<int> stk;
int n = heights.size();
vector<int> left(n, 0), right(n, n);
for (int i = 0; i < n; ++ i) {
while (!stk.empty() && heights[i] < heights[stk.top()]) {
int index = stk.top();
stk.pop();
right[index] = i;
}
left[i] = stk.empty() ? -1 : stk.top();
stk.push(i);
}
for (int i = 0; i < n; i ++) {
ret = max(ret, heights[i] * (right[i] - left[i] - 1));
}
return ret;
}
};