leetcode 力扣 221 最大正方形

动态规划

算法思路

  • 看下图,如果一个以(i, j)为右下角,4 * 4的正方形可以成立,那么以(i, j - 1), (i - 1, j - 1), (i - 1, j)为右下角的,3 * 3的三个正方形(红橙绿三个框)也必须成立。

  • 这里的边长只是举个例子,至于以(i, j)为右下角的正方形边长可以有多长,取决于左上方的三个正方形的边长,然后加1,这就是转移方程里dp[row][column] = Math.min(Math.min(dp[row][column - 1], dp[row - 1][column]), dp[row - 1][column - 1]) + 1 为什么加1的来源。

  • dp表的填表过程中,是从左往右,上到下逐个填的,也就是从左上角到右下角。所以用正方形的右下角,而不是左上角来讨论。

ini 复制代码
public int maximalSquare(char[][] matrix) {
        int rows = matrix.length;
        int columns = matrix[0].length;
        int[][] dp = new int[rows][columns];
        int maxSide = 0;

        for (int row = 0; row < rows; row++) {
            for (int column = 0; column < columns; column++) {
                if (matrix[row][column] == '1') {
                    if (row == 0 || column == 0) {
                        dp[row][column] = 1;
                    } else {
                        dp[row][column] = Math.min(Math.min(dp[row][column - 1], dp[row - 1][column]),
                                dp[row - 1][column - 1]) + 1;
                    }
                }

                maxSide = Math.max(maxSide, dp[row][column]);
            }
        }

        return maxSide * maxSide;
    }
相关推荐
大圣编蚕12 分钟前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
小玮看世界1 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
黎阳之光1 小时前
数字孪生赋能全域水网,实现水资源管控与节水降碳双向提升
人工智能·物联网·算法·安全·数字孪生
随意起个昵称2 小时前
【BFS】冰面滑行
算法·宽度优先
(Charon)3 小时前
【C++】定时器进阶:使用最小堆管理定时任务
c++·算法
hansang_IR3 小时前
【题解】 [省选联考 2021 A/B 卷] 卡牌游戏
c++·算法
这个DBA有点耶3 小时前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
贾伟康3 小时前
【口算王|01】HarmonyOS ArkTS 口算题生成实战:按年级、运算类型和难度生成可控题目
算法·harmonyos·arkts·随机生成·口算题
lzx_0023 小时前
C++11(一)
开发语言·c++·算法
529宝宝起名网4 小时前
用 Python 实现名字寓意评分算法:基于 NLP 语义分析的名字内涵深度评估
python·算法·自然语言处理