Leetcode每日一题 —— 85. 最大矩形

发现之前做过这题,但是代码看了好一会儿才看懂。以后还是老老实实写注释吧。
大体思路是,使用数组rect[i][j][k]表示到i行为止从 (i, j) 到 (i, k) 的列最大高度。然后从当前列往左遍历j,计算面积尝试更新最大值。

看着就有很大优化空间,今天时间有些紧张,有空再优化吧。

代码

class Solution {
    public int maximalRectangle(char matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return 0;
        }
        int row = matrix.length;
        int col = matrix[0].length;
        // rect[i][j][k] 表示以 (i, j) 到 (i, k) 的最大高度
        int rect = new int[row][col][col];
        int max = 0;
        int tmp = 0;
        // 初始化第0行
        for (int j = 0; j < col; j++) {
            if (matrix[0][j] == '1') {
                rect[0][j][j] = 1;
                tmp++;
                for (int k = 1; k < tmp; k++) {
                    rect[0][j - k][j] = 1;
                }
                max = Math.max(max, tmp);
            } else {
                tmp = 0;
            }
        }

        for (int i = 1; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (matrix[i][j] == '1') {
                    // 设置当前列的高度
                    rect[i][j][j] = rect[i - 1][j][j] + 1;
                    max = Math.max(max, rect[i][j][j]);
                    int k = j - 1;
                    // 从当前列的左侧开始,向左扩展,如果某列到当前列有最大高度,则尝试更新最大面积
                    while (k >= 0) {
                        if (rect[i][k][j - 1] > 0) {
                            rect[i][k][j] = rect[i - 1][k][j] + 1;
                            max = Math.max(max, rect[i][k][j] * (j - k + 1));
                        } else {
                            break;
                        }
                        k--;
                    }
                }
            }
        }
        return max;
    }
}

Leetcode的这道题要求我们在给定的二维矩阵中找到最大的矩形,该矩形中的元素都是'1'。文章中给出的代码尝试通过维护一个三维数组rect[i][j][k]来记录从第i行到第i行的每一列的最大高度,然后通过遍历每一列的左侧来计算可能的矩形面积,并尝试更新最大面积。虽然文章中提到代码还有很大的优化空间,但这个方法提供了一个基本的解决思路。对于实际应用,可能需要进一步优化以提高效率。

标签: none

评论已关闭