题目:
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
Example:
Input: [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"] ] Output: 6
Seen this question in a real interview before?
Yes
No
分析:
class Solution {
public int maximalRectangle(char[][] matrix) {
//给定矩阵坐标,其中求出最大面积的表示
//采用分别记录左右高可达边界坐标,从而面积值为(右-左)*gao
if(matrix==null||matrix.length==0) return 0;
int m=matrix.length,n=matrix[0].length;
int [] right=new int[n];
int [] left=new int[n];
int [] height=new int[n];
int maxArea=0;
//对于右边界默认值为n
Arrays.fill(right,n);
for(int i=0;i<m;i++){
int curLeft=0;
int curRight=n;
//求高
for(int j=0;j<n;j++){
if(matrix[i][j]=='1'){
height[j]++;
}else{
height[j]=0;
}
}
//求左边界
for(int j=0;j<n;j++){
if(matrix[i][j]=='1'){
left[j]=Math.max(left[j],curLeft);
}else{
left[j]=0;
curLeft=j+1;
}
}
//求右边界(从右边开始)
for(int j=n-1;j>=0;j--){
if(matrix[i][j]=='1'){
right[j]=Math.min(right[j],curRight);
}else{
right[j]=n;
curRight=j;
}
}
//求面积
for(int j=0;j<n;j++){
maxArea=Math.max(maxArea,(right[j]-left[j])*height[j]);
}
}
return maxArea;
}
}