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;
    }
相关推荐
小柯J桑_26 分钟前
史上最牛排序集合,带你认清所有排序算法!(必看系列)~
数据结构·算法·排序算法
无限大.1 小时前
c语言200例 64
c语言·数据结构·算法
luluvx1 小时前
LeetCode[中等] 78.子集
算法·leetcode·职场和发展
sp_fyf_20241 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-26
人工智能·深度学习·神经网络·算法·语言模型·自然语言处理·数据挖掘
DdddJMs__1351 小时前
C语言 | Leetcode C语言题解之第433题最小基因变化
c语言·leetcode·题解
大二转专业1 小时前
408算法题leetcode--第16天
考研·算法·leetcode
Liu_Junwei2 小时前
如何解决哈希冲突?
数据结构·算法·哈希算法
席万里2 小时前
1605. 给定行和列的和求可行矩阵
数据结构·线性代数·算法·leetcode·矩阵·golang
计信猫3 小时前
从零开学C++:二叉搜索树
数据结构·c++·算法
循环渐进Forward3 小时前
【C++笔试强训】如何成为算法糕手Day1
数据结构·c++·算法·力扣·笔试·牛客