题目描述
思路
暴力解法
遍历所有点,找到以这个点为右下角的最大矩阵面积。
输入数组:char[][] matrix(注意这里是char类型)
辅助数组:left[][] 每个点左侧连续1的数目(包括这个点本身)
目标数组:area[i][j]=//area[i][j] 为以maxtrix[i][j]为矩阵右下角的最大矩阵面积
求得目标数组的方法:
(1)首先找到以这个点为右下角的 高为1的 矩阵,也就是left[i][j]的值
(2)向上走一步,选择这两个点left[i][j] 小的作为宽,计算高为2的面积,如果比高为1时的矩阵面积大,那么就记录下来
(3)重复第二步,直到矩阵的最上面,注意矩阵宽的选择
时间复杂度:O(m²n)
代码
class Solution {
public int maximalRectangle(char[][] matrix) {
//暴力解法:遍历每一个点,求出以该点为右下角的最大矩阵面积
//首先找出每一个点左边连续1的数量
if(matrix.length == 0) return 0;
int[][] left = new int[matrix.length][matrix[0].length];
for(int i=0;i<left.length;i++){//逐行计算
int start = 0;
for(int j=0;j<left[0].length;j++){
if(matrix[i][j] == '1'){
left[i][j] = ++ start;
}else{
left[i][j] = 0;
start = 0;
}
}
}
// showMatrix(left);
//area[i][j] 为以maxtrix[i][j]为矩阵右下角的最大矩阵面积
int[][] area = new int[matrix.length][matrix[0].length];
//下面的工作就是填充这个矩阵
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
int height = 1;
int width = left[i][j];//第一行矩阵的长度,即为这个点左侧连续1的个数(包括这个点本身)
int eachMaxArea = width;
if(width != 0){//这个点不为0
for(int k=i-1;k>=0;k--){
height ++;
if(left[k][j] == 0) break;
if(left[k][j] < width) width = left[k][j];
if(eachMaxArea < (width * height)){
eachMaxArea = width*height;
}
}
area[i][j] = eachMaxArea;
}
}
}
// showMatrix(area);
int maxArea = 0;
for(int i=0;i<area.length;i++){
for(int j=0;j<area[0].length;j++){
if(maxArea < area[i][j]) maxArea = area[i][j];
}
}
return maxArea;
}
private void showMatrix(int[][] matrix){
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
}