LeetCode 85. 最大矩形

题目链接

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;
    }
}
posted @ 2020-09-14 20:26  ZJPang  阅读(102)  评论(0编辑  收藏  举报