Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
Example:
Input: [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"] ] Output: 6
题意
给定一个01矩阵,找出其中全由1构成的最大矩形。
思路
将所有1连接的部分看成一个bar height,这个题就可以看成是[leetcode]84. Largest Rectangle in Histogram直方图中的最大矩形
的followup,进行代码复用
代码
1 class Solution { 2 public int maximalRectangle(char[][] matrix) { 3 if(matrix.length==0 || matrix[0].length==0) return 0; 4 int row = matrix.length; 5 int col = matrix[0].length; 6 int [] heights = new int[col]; 7 int area = 0; 8 for(int i = 0; i< row; i++){ 9 for(int j = 0; j< col; j++){ 10 if(matrix[i][j]=='1'){ 11 heights[j]++; 12 }else{ 13 heights[j]=0; 14 } 15 16 } 17 area = Math.max(area, largestRectangle(heights)); 18 } 19 return area; 20 } 21 22 public int largestRectangle(int[] heights ){ 23 int area = 0; 24 Stack<Integer> s = new Stack<>(); 25 for(int i = 0; i<=heights.length;){ 26 int value = i<heights.length ? heights[i] : 0; 27 if(s.isEmpty() || value > heights[s.peek()]){ 28 s.push(i); 29 i++; 30 }else{ 31 int temp = s.pop(); 32 area = Math.max(area, heights[temp]*(s.isEmpty()? i: i-s.peek()-1)); 33 }// end else 34 }// end for 35 return area; 36 } 37 }