LeetCode Maximal rectangle

来源:互联网 发布:软件操作指南 编辑:程序博客网 时间:2024/06/01 07:22

动态规划。我自己第一遍做没做出来,上网搜了一下答案,发现是用的之前合并方块的思路做得。

就是这样。每次统计每行累计1的个数,然后计算出每行的最大直方图面积。

那么代码是如下所示:

public class Solution {    public int maximalRectangle(char[][] matrix) {if(matrix==null || matrix.length==0 || matrix[0].length==0)  {    return 0;  }  int maxArea = 0;  int[] height = new int[matrix[0].length];  for(int i=0;i<matrix.length;i++)  {    for(int j=0;j<matrix[0].length;j++)    {      height[j] = matrix[i][j]=='0'?0:height[j]+1;    }    maxArea = Math.max(largestRectangleArea(height),maxArea);  }  return maxArea;}public int largestRectangleArea(int[] height) {  if(height==null || height.length==0)  {    return 0;  }  int maxArea = 0;  LinkedList<Integer> stack = new LinkedList<Integer>();  for(int i=0;i<height.length;i++)  {        while(!stack.isEmpty() && height[i]<=height[stack.peek()])    {      int index = stack.pop();      int curArea = stack.isEmpty()?i*height[index]:(i-stack.peek()-1)*height[index];      maxArea = Math.max(maxArea,curArea);    }    stack.push(i);  }  while(!stack.isEmpty())  {    int index = stack.pop();    int curArea = stack.isEmpty()?height.length*height[index]:(height.length-stack.peek()-1)*height[index];    maxArea = Math.max(maxArea,curArea);  }  return maxArea;    }}


0 0
原创粉丝点击