LeetCode-85.最大矩形(相关话题:栈.动态规划)

给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例:

输入:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
输出: 6

解题思路:与LeetCode-87.柱状图中的最大矩形(https://blog.csdn.net/weixin_38823568/article/details/82747210)类似,如下图所示:

求二位矩阵的最大矩形,即端点元素为1,找到以该端点为左上顶点的只包含1的所有矩形,找到所有的矩形,即求出了最大矩形的面积,图中以第一行第三列元素为顶点举例,可以看到找以第三列中为1的元素为左上顶点的所有矩形的过程,类似于求柱状图中的所有矩形的过程(横过来的柱状图),因此利用辅助数组p[i][j],表示第i行第j列元素开始,同一行中连续为1元素的个数(即柱状图的高度),然后用求柱状图的最大矩形的过程,依次处理每一列,即可得到最大矩形的面积

Java代码:

class Solution {
    public int maximalRectangle(char[][] matrix) {
        if(null == matrix || 0 == matrix.length)
            return 0;

        int m = matrix.length, n = matrix[0].length;
        int[][] p = new int[m][n];
        int maxS = 0;
        //构建辅助数组p[][]
        for(int i = 0; i < m; i++) {
            for(int j = n-1; j >= 0; j--) {
                if((n-1) == j) {
                    p[i][j] = 0 == (matrix[i][j] - '0') ? 0 : 1;
                } else {
                    p[i][j] = 0 == (matrix[i][j] - '0') ? 0 : (1 + p[i][j+1]);
                }
            }
        }

        for(int j = 0; j < n; j++) {
            Stack<Integer> s = new Stack<>();
            for(int i = 0; i < m; i++) {
                if(s.isEmpty() || p[i][j] >= p[s.peek()][j]) {
                    s.push(i);
                    continue;
                }

                while(!s.isEmpty() && p[s.peek()][j] > p[i][j]) {
                    int top = s.pop();
                    maxS = Math.max(maxS, ((s.isEmpty() ? i : i-s.peek()-1)) * p[top][j]);
                }
                s.push(i);
            }
            while(!s.isEmpty() && p[s.peek()][j] > 0) {
                int top = s.pop();
                maxS = Math.max(maxS, (s.isEmpty() ? m : m-s.peek()-1) * p[top][j]);
            }
        }

        return maxS;
    }
}

注:还有另外一种动态规划的做法,可参考文章:https://blog.csdn.net/maxiaotiaoti/article/details/62230381,个人感觉文章中对于动态规划的总结挺好的,动态规划三要素:定义概念、边界初始化、一般情况递推

猜你喜欢

转载自blog.csdn.net/weixin_38823568/article/details/82747579
今日推荐