Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
Analyse: For each row, we can determine the all 1's height of each element.
Runtime: 28ms.
1 class Solution { 2 public: 3 int maximalRectangle(vector<vector<char> >& matrix) { 4 if(matrix.empty() || matrix[0].empty()) return 0; 5 6 int row = matrix.size(); 7 int col = matrix[0].size(); 8 vector<vector<int> > bar(row, vector<int> (col, 0)); 9 for(int i = 0; i < row; i++){ 10 for(int j = 0; j < col; j++){ 11 if(matrix[i][j] == '0') bar[i][j] = 0; 12 else bar[i][j] = (i == 0 ? 1 : bar[i - 1][j] + 1); 13 } 14 } 15 16 int result = 0; 17 for(int i = 0; i < row ; i++){ 18 result = max(result, largestRectangleArea(bar[i])); 19 } 20 return result; 21 } 22 int largestRectangleArea(vector<int>& height) { 23 height.push_back(-1); 24 stack<int> index; 25 int i = 0, result = 0; 26 while(i < height.size()){ 27 if(index.empty() || height[i] > height[index.top()]) 28 index.push(i++); 29 else{ 30 int temp = index.top(); 31 index.pop(); 32 result = max(result, height[temp] * (index.empty() ? i :(i-index.top()-1))); 33 } 34 } 35 return result; 36 } 37 };