首页 > 代码库 > Maximal Rectangle
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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。