30 Day Challenge Day 22 | Leetcode 84. Largest Rectangle in Histogram
题解
Hard
方法一:Better Brute Force
思路是好理解的:从左往右遍历,在每一个位置,又从当前位置遍历到数组最后,同时更新 minheight * current_width .
这个方法还不足以通过,但是对后面的85题有启发意义。所以放在这里。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int maxarea = 0;
for (int i = 0; i < heights.size(); i++) {
int minheight = INT_MAX;
for (int j = i; j < heights.size(); j++) {
minheight = min(minheight, heights[j]);
maxarea = max(maxarea, minheight * (j - i + 1));
}
}
return maxarea;
}
};
方法二:栈(Stack)
从左往右遍历,如果当前的值更大,压入栈中,直到遇到一个较小的值,那么此时栈顶就是一个极大值,有可能找到最大的面积。
进入循环,把大于当前位置值的栈内元素都退出。同时更新宽度,更新面积值。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int ret = 0;
heights.push_back(0);
vector<int> index;
for(int i = 0; i < heights.size(); i++) {
while(index.size() > 0 && heights[index.back()] >= heights[i]) {
int h = heights[index.back()];
index.pop_back();
int sidx = index.size() > 0 ? index.back() : -1;
if(h * (i-sidx-1) > ret)
ret = h * (i-sidx-1);
}
index.push_back(i);
}
return ret;
}
};