public int maximalRectangle(char[][] matrix) {
if(matrix == null || matrix.length==0|| matrix[0].length==0) return 0;//记住逻辑或和逻辑与有短路的,要先判断if条件的优先级
int n = matrix.length;//行数
int m = matrix[0].length;//列数
int maxA = 0;
int[] heights = new int[m];//设置每一列的高度
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i==0){
heights[j] = matrix[0][j] - '0';//初始化,因为matrix为char型,要转换
}else
if(matrix[i][j]=='1'){
heights[j] = heights[j] + 1;
}else{
heights[j] = 0;
}
}
maxA = Math.max(maxA,largestRectangleArea(heights));//逐行求出每一行的区域,取最大值
//if()
}
return maxA;
}
或者为每一个矩阵元素设置一个高度值,然后计算改行不同高度值之间最大矩形区域(因为上一题每个直方图的宽度为1,正好符合列索引间的大小关系,故可将上一题求一位数组高度
的算法,放到这道题中,将矩阵分解为求每一行的一位数组高度的最大矩形区域,并逐行求最值
<pre name="code" class="java"> public int maximalRectangle(char[][] matrix) {
if(matrix == null || matrix.length==0|| matrix[0].length==0) return 0;//记住逻辑或和逻辑与有短路的,要先判断if条件的优先级
int n = matrix.length;//行数
int m = matrix[0].length;//列数
int maxA = 0;
int[][] heights = new int[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i==0){
heights[0][j] = matrix[0][j] - '0';//初始化,因为matrix为char型,要转换,所以用字符‘0’
}else
if(matrix[i][j]=='1'){
heights[i][j] = heights[i-1][j] + 1;
}else{
heights[i][j] = 0;
}
}
maxA = Math.max(maxA,largestRectangleArea(heights[i]));
}
return maxA;
}