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.
用动态规划去做,用grid[i]记录matrix[][i]向下有多少个连续的1,就转化为求n个直方图最大面积的问题,求出最大值,计算每行的grid数组时间复杂度为O(n),再求该数组直方图最大面积的时间复杂度为O(n)。共有n行,则总体时间复杂度为O(n^2)。
求矩阵直方图的做法参见Trapping Rain Water。
本题代码如下:
1 public int maximalRectangle(char[][] matrix) { 2 if(matrix==null||matrix.length==0){ 3 return 0; 4 } 5 int[] grid= new int[matrix[0].length]; 6 int max = 0; 7 for(int i=matrix.length-1;i>=0;i--){ 8 for(int j=0;j<matrix[0].length;j++){ 9 if(i==matrix.length-1){ 10 grid[j] = (matrix[i][j]=='1'?1:0); 11 }else{ 12 grid[j] = (matrix[i][j]=='1'?1+grid[j]:0); 13 } 14 } 15 Stack<Integer> pos = new Stack<>(); 16 Stack<Integer> high = new Stack<>(); 17 int m = 0; 18 pos.add(0); 19 high.add(grid[0]); 20 for(int k=1;k<grid.length;k++){ 21 int p = k; 22 while(!high.empty()&&grid[k]<high.peek()){ 23 p = pos.pop(); 24 int area = (k-p)*high.pop(); 25 m = m>area?m:area; 26 } 27 pos.add(p); 28 high.add(grid[k]); 29 } 30 while(!high.empty()){ 31 int area = (grid.length-pos.pop())*high.pop(); 32 m = m>area?m:area; 33 } 34 max=max>m?max:m; 35 } 36 return max; 37 }