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;
    }
相关推荐
INGNIGHT几秒前
377.组合总和 Ⅳ(背包)
c++·算法·1024程序员节
拓恒技术22 分钟前
城市管理中的无人机AI识别算法:架构、场景与落地
人工智能·算法·视觉检测·无人机·1024程序员节
吴可可1231 小时前
Accumark二次开发环境搭建与API入门
算法
文丑颜不良啊1 小时前
LeetCode701~725题目解析
java·leetcode
木井巳2 小时前
【动态规划: 线性dp】解码方法
java·算法·leetcode·动态规划·推荐算法
春弦_10 小时前
自用算法整理二
数据结构·算法·图论
hetao173383711 小时前
2026-10-22~23 hetao1733837 的刷题记录
c++·算法
java_nnnn12 小时前
LeetCode刷题滑动窗口(串联所有单词的子串+最小覆盖的子串)Java
算法·leetcode·职场和发展
Navigator_Z12 小时前
LeetCode //C - 1301. Number of Paths with Max Score
c语言·算法·leetcode
卡卡~~13 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法