标签:
Given a 2D binary matrix filled with 0‘s and 1‘s, find the largest rectangle containing all ones and return its area.
1 0 1 1 0
1 1 0 1 0
0 1 1 1 1
有如下结果:
第1行: dpHeight[] = {1, 0, 1, 1, 0}
第2行: dpHeight[] = {2, 1, 0, 2, 0}
第3行: dpHeight[] = {0, 2, 1, 3, 0}
1 class Solution { 2 public: 3 int maximalRectangle(vector<vector<char> > &matrix) { 4 5 6 int m=matrix.size(); 7 if(m==0) return 0; 8 int n=matrix[0].size(); 9 10 vector<int> dpHeight(n,0); 11 12 int result=0; 13 for(int i=0;i<m;i++) 14 { 15 for(int j=0;j<n;j++) 16 { 17 if(matrix[i][j]==‘1‘) dpHeight[j]++; 18 else dpHeight[j]=0; 19 } 20 21 int tmp=lineMaximalRectangle(dpHeight); 22 if(tmp>result) result=tmp; 23 } 24 25 return result; 26 } 27 28 struct Node 29 { 30 int index; 31 int height; 32 Node(int i,int h):index(i),height(h){}; 33 }; 34 35 int lineMaximalRectangle(vector<int> &dpHeight) 36 { 37 38 39 int len=dpHeight.size(); 40 if(len==0) return 0; 41 42 stack<Node> stk; 43 Node n(0,dpHeight[0]); 44 stk.push(n); 45 46 int result=0; 47 for(int i=1;i<len;i++) 48 { 49 int height=dpHeight[i]; 50 51 if(height>=stk.top().height) 52 { 53 stk.push(Node(i,height)); 54 } 55 else 56 { 57 int nodeIndex=i; 58 while(!stk.empty()&&height<stk.top().height) 59 { 60 int tmp=(i-stk.top().index)*stk.top().height; 61 if(tmp>result) result=tmp; 62 nodeIndex=stk.top().index; 63 stk.pop(); 64 } 65 stk.push(Node(nodeIndex,height)); 66 } 67 } 68 while(!stk.empty()) 69 { 70 int index=stk.top().index; 71 int height=stk.top().height; 72 int tmp=(len-index)*height; 73 if(tmp>result) result=tmp; 74 stk.pop(); 75 } 76 77 return result; 78 79 } 80 };
标签:
原文地址:http://www.cnblogs.com/reachteam/p/4237159.html