LeetCode 85. 最大矩形
题目链接
题目分析
这个题和最大正方形有点类似,但是这个是个矩形,所以需要特殊手段来求,但是总体来说dp的思路是没问题的。
我们开一个三维数组dp[i][j][k], i代表第i行,j代表列,k代表两个方向上1的个数。
dp[i][j][0] 就是matrix[i][j]水平方向累计多少个连续1, dp[i][j][1]就是matrix[i][j]竖直方向累计多少个1。
这里为了方便计算,我们dp数组的i,j进行加1的偏移。
我们每遍历到1的时候,都需要对以matrix[i][j]为右下角的矩形进行面积的计算。
在计算的时候我们动态更新下当前矩形最高的高度,因为矩形高度取决于最短的那个。
具体看代码吧。
代码实现
class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix.length == 0){
return 0;
}
int[][][] dp = new int[matrix.length + 1][matrix[0].length + 1][2];
int max = 0;
for(int i = 1; i <= matrix.length; i++){
for(int j = 1; j <= matrix[i - 1].length; j++){
if(matrix[i-1][j-1] == '1'){
dp[i][j][0] = dp[i][j-1][0] + 1;
dp[i][j][1] = dp[i-1][j][1] + 1;
int idx = dp[i][j][0];
int high = Integer.MAX_VALUE;
for(int k = 1; k <= idx; k++){
high = Math.min(high, dp[i][j - k + 1][1]);
max = Math.max(max, k * high);
}
}
}
}
return max;
}
}