给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例 1:
输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]
输出:6
代码
class Solution {public int maximalRectangle(char[][] matrix) {if(matrix.length==0) return 0;int n=matrix.length,m=matrix[0].length;int[][][] dp=new int[n][m][2];//dp[i][j][0]表示matrix[i][j]左边有多少个1,dp[i][j][1]表示matrix[i][j]上边有多少个1dp[0][0][0]=matrix[0][0]=='1'?1:0;dp[0][0][1]=matrix[0][0]=='1'?1:0;int res=matrix[0][0]=='1'?1:0;for(int i=1;i<m;i++)//初始化最上面的一行{if(matrix[0][i]=='1'){dp[0][i][0]=dp[0][i-1][0]+1;dp[0][i][1]=1;res= Math.max(res,dp[0][i][0]*dp[0][i][1]);}}for(int i=1;i<n;i++)//初始化最左边的一列{if(matrix[i][0]=='1'){dp[i][0][1]=dp[i-1][0][1]+1;dp[i][0][0]=1;res= Math.max(res, dp[i][0][1]*dp[i][0][0]);}}for(int i=1;i<n;i++)for(int j=1;j<m;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;//刷新当前位置的dp值int len=dp[i][j][0],le=1;res= Math.max(res, le*len);le++;for(int k=1;k<dp[i][j][1];k++,le++)//从当前行开始向上遍历以当前位置为右下角的所有可能组成的矩阵,计算面积{len=Math.min(len,dp[i-k][j][0]);res= Math.max(res, le*len);}}}return res;}
}