Largest Rectangle in Histogram:
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
.
class Solution {
public:
int largestRectangleArea(vector<int> &h) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int n=h.size();
vector<int> lHigh(n,-1);
typedef pair<int,int> pos;
stack<pos> lQ;
lQ.push(pos(-1,-1));
for(int i=0;i<n;i++)
{
while(lQ.top().first>=h[i])
lQ.pop();
lHigh[i]=lQ.top().second+1;
lQ.push(pos(h[i],i));
}
vector<int> rHigh(n,-1);
stack<pos> rQ;
rQ.push(pos(-1,n));
for(int i=n-1;i>=0;i--)
{
while(rQ.top().first>=h[i])
rQ.pop();
rHigh[i]=rQ.top().second-1;
rQ.push(pos(h[i],i));
}
int res=0;
for(int i=0;i<n;i++)
res=max(res,(rHigh[i]-lHigh[i]+1)*h[i]);
return res;
}
};
Maximal Rectangle:
Given
a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area
看来LeetCode把这两个题放在一起是有暗示的~
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int m=matrix.size();
if ( m==0 )
return 0;
int n= matrix[0].size();
vector<vector<char> > tmp(m,vector<char>(n,0));
for(int i=0;i<n;i++)
tmp[0][i]=matrix[0][i]-'0';
for(int i=1;i<m;i++)
for(int j=0;j<n;j++)
if (matrix[i][j]=='1')
tmp[i][j]=tmp[i-1][j]+matrix[i][j]-'0';
else
tmp[i][j]=0;
int ret=0;
for(int i=0;i<m;i++)
ret=max(ret,solve(tmp[i]));
return ret;
}
int solve(vector<char> &h) {
int n=h.size();
vector<int> lHigh(n,-1);
typedef pair<int,int> pos;
stack<pos> lQ;
lQ.push(pos(-1,-1));
for(int i=0;i<n;i++)
{
while(lQ.top().first>=h[i])
lQ.pop();
lHigh[i]=lQ.top().second+1;
lQ.push(pos(h[i],i));
}
vector<int> rHigh(n,-1);
stack<pos> rQ;
rQ.push(pos(-1,n));
for(int i=n-1;i>=0;i--)
{
while(rQ.top().first>=h[i])
rQ.pop();
rHigh[i]=rQ.top().second-1;
rQ.push(pos(h[i],i));
}
int res=0;
for(int i=0;i<n;i++)
res=max(res,(rHigh[i]-lHigh[i]+1)*h[i]);
return res;
}
};