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
.
思路1:O(n^2),两层循环计算所有可能的矩阵面积。小数可以通过,大数级超时。
class Solution { public: int largestRectangleArea(vector<int> &height) { int n=height.size(); if(n==0) return 0; int maxArea; for(int i=0;i<n;i++) { int width=height[i]; for(int k=i;k<n;k++) { if(width*(n-i)<=maxArea) break; width=min(width,height[k]); maxArea=max(maxArea,width*(k-i+1)); } } return maxArea; } };
思路2:使用一种单调递增的stack,可以用O(n)解决这道题目;主要是循环遍历,栈顶元素指向的heigh值如果小于height[i],则入栈i+1;如果大于height[i],则做这样的处理——将栈顶元素取出,这是有两种情况1)栈为空,则此时的area为目前的height值乘以i;2)栈不为空,计算此时的area。从而比较得到最大maxArea;
注意:一定要在height后面添加一元素0或者其他较小值,保证当可以对最后一个元素进行操作。
class Solution { public: int largestRectangleArea(vector<int> &height) { int n=height.size(); if(n==1) return height[0]; int maxArea=0; int area; stack<int> s; height.push_back(0); for(int i=0;i<=n;) { if(s.empty()||height[s.top()]<=height[i]) { s.push(i++); } else { int k=s.top(); s.pop(); if(s.empty()) { area=height[k]*i; } else { area=height[k]*(i-s.top()-1); } maxArea=max(maxArea,area); } } return maxArea; } };