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;
    }
相关推荐
蒟蒻小袁20 分钟前
力扣面试150题--被围绕的区域
leetcode·面试·深度优先
Q81375746044 分钟前
中阳视角下的资产配置趋势分析与算法支持
算法
yvestine1 小时前
自然语言处理——文本表示
人工智能·python·算法·自然语言处理·文本表示
GalaxyPokemon1 小时前
LeetCode - 148. 排序链表
linux·算法·leetcode
iceslime2 小时前
旅行商问题(TSP)的 C++ 动态规划解法教学攻略
数据结构·c++·算法·算法设计与分析
aichitang20242 小时前
矩阵详解:从基础概念到实际应用
线性代数·算法·矩阵
OpenCSG3 小时前
电子行业AI赋能软件开发经典案例——某金融软件公司
人工智能·算法·金融·开源
chao_7894 小时前
链表题解——环形链表 II【LeetCode】
数据结构·leetcode·链表
dfsj660114 小时前
LLMs 系列科普文(14)
人工智能·深度学习·算法
薛定谔的算法4 小时前
《盗梦空间》与JavaScript中的递归
算法