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; } };