Maximal Rectangle 原题地址:
https://oj.leetcode.com/problems/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.
求由0和1构成的矩阵中最大子矩阵的面积,该子矩阵中所有元素均为1.
可以由上向下逐行计算以该行为底的柱状图的最大面积,再求最大值。计算柱状图最大矩阵面积见http://blog.csdn.net/muscler/article/details/23636077
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;
}
}