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.
#include <iostream>
#include <string>
#include <vector>
#include <assert.h>
using namespace std;
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
int len = height.size();
if(len == 0)
return -1;
int min = 0;
int maxArea = 0;
recursion(height, 0, len - 1, maxArea);
return maxArea;
}
void recursion(vector<int> &ivec, int L, int R, int &maxArea)
{
if(L > R)
return;
int i = CalArea(ivec, L, R, maxArea);
recursion(ivec, L, i - 1, maxArea);
recursion(ivec, i + 1, R, maxArea);
}
int CalArea(vector<int> &ivec, int L, int R, int &maxArea)
{
assert(L <= R);
int min = ivec[L];
int k = L;
for(int i = L + 1; i <= R; ++i) {
if(ivec[i] < min) {
min = ivec[i];
k = i;
}
}
int area = min * (R - L + 1);
if(area > maxArea)
maxArea = area;
return k;
}
};
int main(void)
{
vector<int> ivec = {2,1,5,6,2,3};
Solution ss;
int ret = ss.largestRectangleArea(ivec);
cout << ret << endl;
}
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
if(height.size() == 0)
return 0;
height.push_back(0);
stack<int> istack;
int maxArea = 0;
int i = 0;
while(i < height.size()) {
if(istack.empty() || height[i] >= height[istack.top()]) {
istack.push(i++);
}
else {
int t = istack.top();
istack.pop();
maxArea = max(maxArea, height[t] *
(istack.empty() ? i : i - istack.top() - 1));
}
}
return maxArea;
本文介绍了一种求解直方图中最大矩形面积的有效算法。通过递归和栈两种方法实现,递归方法虽然直观但效率较低,而栈方法则更加高效。栈方法利用单调栈来快速找到每个柱子左右两边第一个比它低的柱子,从而计算出最大面积。
7709

被折叠的 条评论
为什么被折叠?



