标签:style color io ar java for sp div art
Given a 2D binary matrix filled with 0‘s and 1‘s, find the largest rectangle containing all ones and return its area.
public class Solution {
char [][]matrix;
int ROW;
int COL;
public static class Node
{
int row;
int col;
Node(int row, int col)
{
this.row = row;
this.col = col;
}
}
public boolean canAddRow(int row,int col,Node node)
{
if(node.row==ROW-1)
{
return false;
}
for(;col<=node.col;col++)
{
if(matrix[node.row+1][col]=='0')
{
return false;
}
}
return true;
}
public boolean canAddCol(int row,int col,Node node)
{
if(node.col==COL-1)
{
return false;
}
for(;row<=node.row;row++)
{
if(matrix[row][node.col+1]=='0')
{
return false;
}
}
return true;
}
public boolean isAllOne(int startRow,int endRow,int startCol,int endCol)
{
for(int row=startRow;row<=endRow;row++)
{
for(int col=startCol;col<=endCol;col++)
{
if(matrix[row][col]!='1')
{
return false;
}
}
}
return true;
}
public int maximalRectangle(char[][] matrix)
{
if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
{
return 0;
}
ROW = matrix.length;
COL = matrix[0].length;
this.matrix=matrix;
int area = 0;
Node[][] square = new Node[ROW][COL];
for (int row = 0; row < ROW; row++ )
{
for (int col = 0; col < COL; col++ )
{
square[row][col] = new Node(row, col);
}
}
for (int row = 0; row < ROW; row++ )
{
for (int col = 0; col < COL; col++ )
{
if (matrix[row][col] == '1')
{
if (row > 0)
{
square[row][col].row = Math.max(square[row][col].row,
square[row - 1][col].row);
square[row][col].col = Math.max(square[row][col].col,
square[row - 1][col].col-1);
}
if (col > 0)
{
square[row][col].row = Math.max(square[row][col].row,
square[row][col - 1].row-1);
square[row][col].col = Math.max(square[row][col].col,
square[row][col - 1].col);
if (row > 0)
{
square[row][col].row = Math.max(square[row][col].row,
square[row - 1][col - 1].row);
square[row][col].col = Math.max(square[row][col].col,
square[row - 1][col - 1].col);
}
}
while(canAddRow(row,col,square[row][col])&&canAddCol(row,col,square[row][col])
&&(matrix[square[row][col].row+1][square[row][col].col+1]=='1'))
{
square[row][col].row++;
square[row][col].col++;
}
//System.out.println(row+"\t"+col+":"+square[row][col].row+"\t"+square[row][col].col);
}
}
}
for (int row = 0; row < ROW; row++ )
{
for (int col = 0; col < COL; col++ )
{
if (matrix[row][col] == '1')
{
int minRow=row;
int maxRow=square[row][col].row;
for(;minRow>0;minRow--)
{
if(!isAllOne(minRow-1,minRow-1,col,square[row][col].col))
{
break;
}
}
for(;maxRow<ROW-1;maxRow++)
{
if(!isAllOne(maxRow+1,maxRow+1,col,square[row][col].col))
{
break;
}
}
int minCol=col;
int maxCol=square[row][col].col;
for(;minCol>0;minCol--)
{
if(!isAllOne(row,square[row][col].row,minCol-1,col))
{
break;
}
}
for(;maxCol<COL-1;maxCol++)
{
if(!isAllOne(row,square[row][col].row,col,maxCol+1))
{
break;
}
}
area=Math.max(area, (maxRow-minRow+1)*(square[row][col].col-col+1));
area=Math.max(area, (square[row][col].row-row+1)*(maxCol-minCol+1));
}
}
}
return area;
}
}标签:style color io ar java for sp div art
原文地址:http://blog.csdn.net/jiewuyou/article/details/40074935