解法一:种子点扩展
class Solution {
public static int maxArea;
public static int N_ROW;
public static int N_COL;
public int maximalRectangle(char[][] matrix) {
N_ROW=matrix.length;
if(matrix==null || N_ROW==0)
return 0;
N_COL=matrix[0].length;
maxArea=0;
for(int i=0;i<N_ROW;i++)
{
for(int j=0;j<N_COL;j++)
{
if(matrix[i][j]=='1')
{
maxArea=Math.max(maxArea,1);
expand(i,j,1,1,matrix);
}
}
}
return maxArea;
}
public static void expand(int i,int j,int width,int height,char[][] matrix)
{
if(j+width<N_COL)
{
for(int dh=0;dh<height;dh++)
{
if(matrix[i+dh][j+width]=='0')
{
break;
}
if(dh==height-1)
{
maxArea=Math.max(maxArea,(1+width)*height);
expand(i,j,width+1,height,matrix);
}
}
}
if(i+height<N_ROW)
{
for(int dw=0;dw<width;dw++)
{
if(matrix[i+height][j+dw]=='0')
break;
if(dw==width-1)
{
maxArea=Math.max(maxArea,(1+height)*width);
expand(i,j,width,height+1,matrix);
}
}
}
}
}
解法二:转为直方图最大矩形问题
class Solution {
public static int maxArea;
public static int N_ROW;
public static int N_COL;
public int maximalRectangle(char[][] matrix) {
N_ROW=matrix.length;
if(matrix==null || N_ROW==0)
return 0;
N_COL=matrix[0].length;
maxArea=0;
int[] heights=new int[N_COL];
for(int i=0;i<N_ROW;i++)
{
for(int j=0;j<N_COL;j++)
{
heights[j]=matrix[i][j]=='0'?0:heights[j]+1;
}
maxArea=Math.max(maxArea,largestRectangleArea(heights));
}
return maxArea;
}
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack=new Stack<>();
int maxArea=0,n=heights.length;
for(int i=0;i<=n;i++)
{
while(!stack.isEmpty() && (i==n || heights[stack.peek()]>heights[i]) )
{
int index=stack.pop();
int h=heights[index];
int w=stack.isEmpty()?i:i-stack.peek()-1;
maxArea=Math.max(maxArea,h*w);
}
stack.push(i);
}
return maxArea;
}
}
解法三:
class Solution {
public static int maxArea;
public static int N_ROW;
public static int N_COL;
public int maximalRectangle(char[][] matrix) {
N_ROW=matrix.length;
if(matrix==null || N_ROW==0)
return 0;
N_COL=matrix[0].length;
maxArea=0;
for(int i=0;i<N_ROW;i++)
{
for(int j=0;j<N_COL-1;j++)
{
matrix[i][j+1] = matrix[i][j+1]=='1'?(char)(matrix[i][j]+1):'0';
}
}
for(int i=0;i<N_ROW;i++)
{
for(int j=0;j<N_COL;j++)
{
if(matrix[i][j]!='0')
{
int minSequence=matrix[i][j]-'0';
for(int k=i;k>=0;k--)
{
minSequence=Math.min(minSequence,matrix[k][j]-'0');
maxArea=Math.max(maxArea,minSequence*(i-k+1));
}
}
}
}
return maxArea;
}
}