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;
    }
相关推荐
cici1587421 小时前
基于K-SVD的稀疏编码去噪算法
算法
电力程序小学童21 小时前
基于密集型复杂城市场景下求解无人机三维路径规划的Q-learning算法研究(matlab)
算法·matlab·无人机
小柯J桑_21 小时前
Linux:线程控制
linux·c++·算法
1白天的黑夜121 小时前
栈-1047.删除字符串中的所有相邻重复项-力扣(LeetCode)
c++·leetcode·
im_AMBER21 小时前
Leetcode 18 java
java·算法·leetcode
wzx_Eleven21 小时前
【论文阅读】Towards Privacy-Enhanced and Robust Clustered Federated Learning
论文阅读·人工智能·算法·机器学习·支持向量机·网络安全
旭意21 小时前
C++微基础蓝桥杯之旅9.9-9.12
c++·算法·蓝桥杯
地平线开发者1 天前
工具链部署实用技巧 7|模型设计帧率推理时耗时与带宽分析
算法·自动驾驶
lifallen1 天前
Hadoop MapOutputBuffer:Map高性能核心揭秘
java·大数据·数据结构·hadoop·算法·apache
溟洵1 天前
【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)
c语言·c++·算法