题目为计算一个二维矩阵中由1组成的矩形面积。
这道题要用动态规划来做,用三个数组来记录一个矩形的信息。
left[i,j],左数组记录的是对于i行,j列元素,由他组成的矩形的最左边的1的位置。
right[i,j],右数组记录的是对于i行,j列元素,由他组成的矩形的最右边的的1的位置加1。这样直接右边减去左边就是矩形的宽。
height[i,j],高素组记录的是对于i行,j列元素,有他组成的矩形的高。
从第一行扫描到最后一行,没行left从左到右扫描,right从右到左扫描。
left(right)不仅要记录本行的信息,还要记录上一行的信息,这样矩形才是方正的,所有更新left(right)的时候有一个与之前值的比较函数。
下面是解题代码
public int maximalRectangle(char[][] matrix) {
if(matrix.length==0) return 0;
int m=matrix.length,n=matrix[0].length;
int[] left=new int[n],right=new int[n],height=new int[n];
Arrays.fill(left, 0);
Arrays.fill(right, n);
Arrays.fill(height, 0);
int maxarea=0;
for(int i=0;i<m;i++){
int cur_left=0,cur_rihgt=n;
for(int j=0;j<n;j++){
if(matrix[i][j]=='1'){
height[j]+=1;
}
else{
height[j]=0;
}
}
//left[j]记录的是1在最左边的位置
for(int j=0;j<n;j++){
if(matrix[i][j]=='1'){
left[j]=Math.max(left[j], cur_left);
}
else{
left[j]=0;
cur_left=j+1;
}
}
for(int j=n-1;j>=0;j--){
if(matrix[i][j]=='1'){
right[j]=Math.min(right[j], cur_rihgt);
}
else{
right[j]=n;
cur_rihgt=j;
}
}
for(int j=0;j<n;j++){
maxarea=Math.max(maxarea, (right[j]-left[j])*height[j]);
}
}
return maxarea;
}