Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
首先,对于每一行,从第一个元素依次遍历,若当前元素为1,则记录包括当前元素开始向前有多少个连续的1的个数;若为0,则记录为0。
其次,按列遍历。对于每一个非0 的记录,从当前这点开始,向上与向下各扫描一次,直到遇到记录小于当前记录的时候停止。同时统计扫描的行数(记为count,初始算作自己为1,count最终为扫描的行数总和,不算小于该记录的行数)。
则针对当前位置所在的最大矩形即为 当前记录*count。
记录下每次得到的矩形,得到最大值。
分析如图:
图1:原始矩阵
图2:记录矩阵
图3:对于2来说,向上2行,向下1行,自己1行,count=4,
因此自己所处位置为终点的矩形面积为8.
遍历之后得到的面积就是最大的面积。
注意:1、在某一点得到的面积,并不是该点所在的最大矩形面积。只能是以该点所在的列为最右一条边的矩形面积。
2、若想得到最大的那个矩形矩阵,则在每次比较max的时候进行记录就好。
AC代码:
public class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix.length == 0)
return 0;
int max = 0;
int m = matrix.length;
int n = matrix[m-1].length;
int[][] metrix = new int[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(j==0){
if(matrix[i][j]=='1'){
metrix[i][j]= 1;
}
else
metrix[i][j] = 0;
}
else{
if(matrix[i][j]=='0')
metrix[i][j]=0;
else{
metrix[i][j] = metrix[i][j-1]+1;
}
}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(metrix[i][j]==0)
continue;
int count = 1;
for(int k = i-1;k>=0 && metrix[k][j]>=metrix[i][j];k--,count++);
for(int k = i+1;k<m && metrix[k][j]>=metrix[i][j];k++,count++);
if(max<metrix[i][j] * count){
max = metrix[i][j] * count;
}
}
}
return max;
}
}