题目描述
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
解题思路
动态规划的思想,记录每一个位置向上能到达的最大高度,和向左能到达的最大宽度。
在一个点进行遍历时,向左走该点的最大宽度,
每走一步记录当前的最大高度并计算此时的最大面积。
代码实现
java
class Solution {
public int maximalRectangle(char[][] matrix) {
int m=matrix.length;
if(m == 0) return 0;
int n=matrix[0].length;
int max=0;
int[][][] dp=new int[m][n][2];
// 0-> width 1->height
if(matrix[0][0]=='1'){
dp[0][0][0]=1;
dp[0][0][1]=1;
max=1;
}
for (int i=1;i<n;i++){
if(matrix[0][i]=='1'){
dp[0][i][0]=dp[0][i-1][0]+1;
dp[0][i][1]=1;
max=Math.max(max,dp[0][i][0]);
}
}
for (int i=1;i<m;i++){
if(matrix[i][0]=='1'){
dp[i][0][1]=dp[i-1][0][1]+1;
dp[i][0][0]=1;
max=Math.max(max,dp[i][0][1]);
}
}
for (int i=1;i<m;i++){
for (int j=1;j<n;j++){
if(matrix[i][j]=='1'){
dp[i][j][0]=dp[i][j-1][0]+1;
dp[i][j][1]=dp[i-1][j][1]+1;
int width=dp[i][j][0],height=dp[i][j][1],minHeight=height;
for (int k=1;k<=width;k++){
minHeight=Math.min(minHeight,dp[i][j-k+1][1]);
max=Math.max(max,k*minHeight);
}
}
}
}
return max;
}
}