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;
    }
相关推荐
你撅嘴真丑7 小时前
第九章-数字三角形
算法
uesowys8 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder8 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮8 小时前
AI 视觉连载1:像素
算法
智驱力人工智能8 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥9 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风9 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風9 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT0610 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠10 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法