您的位置:首页 > 其它

LeetCode Maximal rectangle

2016-08-10 20:17 405 查看
动态规划。我自己第一遍做没做出来,上网搜了一下答案,发现是用的之前合并方块的思路做得。

就是这样。每次统计每行累计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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: