Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
class Solution { public: int largestRectangleArea(vector<int>& heights) { int n = heights.size(); int i,j; int max=0; stack<int> sk; vector<int> down; sk.push(0); if(n== 0) return 0; for(i=0;i<n;i++) { down.push_back(0); } for(i=1;i<n;i++) { while(!sk.empty()) { int t =sk.top(); if(heights[i]>=heights[t]) { break; } else { int area = heights[t]*(i-t+down[t]); if(area > max) max = area; sk.pop(); down[i] = down[i] +1 + down[t]; } } sk.push(i); } while(!sk.empty()) { int t = sk.top(); int area = heights[t]*(n-t+down[t]); if(area > max) max = area; sk.pop(); } return max; } int maximalRectangle(vector< vector<char> >& matrix) { vector<vector<int>> maxlen; int m = matrix.size(); if(m==0) return 0; int n = matrix[0].size(); if(n==0) return 0; int i,j; int max=0; maxlen.resize(m+1); for(i=0;i<m;i++) { maxlen[i].resize(n+1); for(j=n-1;j>=0;j--) { if(j==n-1) { if(matrix[i][j]=='0') maxlen[i][j]=0; else maxlen[i][j]=1; } else { if(matrix[i][j]=='0') maxlen[i][j]=0; else { maxlen[i][j] = maxlen[i][j+1]+1; } } } } for(j=0;j<n;j++) { int start = 0; while(start<m) { vector<int> heights; while(start<m &&maxlen[start][j]==0)start++; while(start<m &&maxlen[start][j] !=0) { heights.push_back(maxlen[start][j]); start++; } if(heights.size()!=0) { int ar=largestRectangleArea(heights); if(ar>max) max=ar; } } } return max; } };