Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.For example, given the following matrix:
public class Solution
{
public int maximalRectangle(char [][]matrix)
{
if(matrix==null || matrix.length==0 || matrix[0].length==0) return 0;
int colLen = matrix[0].length;
int []height = new int[colLen];
int []left = new int[colLen];
int []right = new int[colLen];
Arrays.fill(right, colLen-1);
int maxRes = 0;
for(int i=0; i<matrix.length; i++)
{
int curLeft = 0;
int curRight = colLen-1;
for(int j=0; j<colLen; j++) height[j] = matrix[i][j]=='1' ? height[j]+1:0;
for(int j=0; j<colLen; j++)
{
if(matrix[i][j] == '1') left[j] = Math.max(left[j], curLeft);
else
{
curLeft = j+1;
left[j] = 0;
}
}
for(int j=colLen-1; j>=0; j--)
{
if(matrix[i][j] == '1') right[j] = Math.min(right[j], curRight);
else
{
curRight = j-1;;
right[j] = colLen-1;
}
}
for(int j=0; j<colLen; j++)
{
maxRes = Math.max(maxRes, (right[j]-left[j]+1)*height[j]);
}
}
return maxRes;
}
}
public class Solution { public int maximalRectangle(char [][]matrix) { if(matrix==null || matrix.length==0 || matrix[0].length==0) return 0; int []height = new int[matrix[0].length]; int maxRes = 0; for(int i=0; i<matrix.length; i++) { for(int j=0; j<matrix[0].length; j++) { height[j] = matrix[i][j]=='1' ? height[j]+1 : 0; } maxRes = Math.max(maxRes, maxRecHistogram(height)); } return maxRes; } // 直方图中最大矩形 public int maxRecHistogram(int []height) { Stack<Integer> stack = new Stack<>(); int maxRes = 0; for(int i=0; i<height.length; i++) { while(!stack.isEmpty() && height[i]<height[stack.peek()]) { int topH = height[stack.pop()]; int curArea = (i-1 - (stack.isEmpty()? -1:stack.peek())) * topH; maxRes = Math.max(maxRes, curArea); } stack.push(i); } while(!stack.isEmpty()) { int topH = height[stack.pop()]; int curArea = (height.length-1- (stack.isEmpty()? -1:stack.peek())) * topH; maxRes = Math.max(maxRes, curArea); } return maxRes; } }