LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形

题目链接

题目描述

给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。

示例1:

复制代码
输入: 

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

输出: 4

示例2:

复制代码
输入: 

0 1 1 0 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

输出: 9

解题思路

这道题的思路是使用动态规划来解决。

首先,我们可以定义一个二维数组 dp,其中 dp[i][j] 表示以矩阵中第 i 行第 j 列为右下角的最大正方形的边长。

然后,我们可以从左上角开始,逐行逐列地更新 dp 数组。

如果当前matrix[i][j]1,则 dp[i][j] 可以由以下三个位置的较小值加 1 得到:

  • dp[i-1][j]
  • dp[i][j-1]
  • dp[i-1][j-1]

依据此,我们可以写出状态转移方程:

复制代码
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1

初始条件:

复制代码
dp[0][j] = 1 if matrix[0][j] == '1'
dp[i][0] = 1 if matrix[i][0] == '1'

最后,我们返回 dp 数组中最大值乘以最大值,即为最大正方形的面积。

复杂度分析

  • 时间复杂度: O ( n m ) O(nm) O(nm),其中 n n n 和 m m m 分别是矩阵的行数和列数。
  • 空间复杂度: O ( n m ) O(nm) O(nm),其中 n n n 和 m m m 分别是矩阵的行数和列数。

代码实现

Go版本

go 复制代码
func maximalSquare(matrix [][]byte) int {
    n:=len(matrix)
    m:=len(matrix[0])
    dp:=make([][]int,n)
    res:=0

    for i:=range dp{
        dp[i]=make([]int,m)
        if(matrix[i][0]=='1'){
            dp[i][0]=1
            res=1
        }
    }

    for j:=0;j<m;j++{
        if(matrix[0][j]=='1'){
            dp[0][j]=1
            res=1
        }
    }


    for  i:=1;i<n;i++{
        for  j:=1;j<m;j++{
           if(matrix[i][j]=='1'){
             dp[i][j]=min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])+1
           }
           res=max(res,dp[i][j])
        }
    }
    return res*res
}

Python版本

python 复制代码
class Solution(object):
    def maximalSquare(self, matrix):
        n=len(matrix)
        m=len(matrix[0])
        dp=[[0]*m for i in range(n)]
        res=0 

        for i in range(n):
            if matrix[i][0]=='1':
                res=1
                dp[i][0]=1
        
        for j in range(m):
            if matrix[0][j]=='1':
                res=1
                dp[0][j]=1

        for i in range(1,n):
            for j in range(1,m):
                if matrix[i][j]=='1':
                   dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
                   res=max(res,dp[i][j])
        
        return res*res

C++版本

cpp 复制代码
class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int n = matrix.size();
        int m = matrix[0].size();
        vector<vector<int>> dp(n, vector<int>(m, 0));
        int res = 0;

        for (int i = 0; i < n; ++i) {
            if (matrix[i][0] == '1') {
                dp[i][0] = 1;
                res = 1;
            }
        }

        for (int j = 0; j < m; ++j) {
            if (matrix[0][j] == '1') {
                dp[0][j] = 1;
                res = 1;
            }
        }

        for (int i = 1; i < n; ++i) {
            for (int j = 1; j < m; ++j) {
                if (matrix[i][j] == '1') {
                    dp[i][j] = min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]}) + 1;
                    res = max(res, dp[i][j]);
                }
            }
        }

        return res * res;  
    }
};
相关推荐
以卿a3 分钟前
C++(继承)
开发语言·c++·算法
I_LPL5 分钟前
day22 代码随想录算法训练营 回溯专题1
算法·回溯算法·求职面试·组合问题
金融RPA机器人丨实在智能10 分钟前
2026动态规划新风向:实在智能Agent如何以自适应逻辑重构企业效率?
算法·ai·重构·动态规划
elseif12344 分钟前
【C++】并查集&家谱树
开发语言·数据结构·c++·算法·图论
偷吃的耗子1 小时前
【CNN算法理解】:卷积神经网络 (CNN) 数值计算与传播机制
人工智能·算法·cnn
徐小夕@趣谈前端1 小时前
Web文档的“Office时刻“:jitword共建版2.0发布!让浏览器变成本地生产力
前端·数据结构·vue.js·算法·开源·编辑器·es6
问好眼1 小时前
【信息学奥赛一本通】1275:【例9.19】乘积最大
c++·算法·动态规划·信息学奥赛
Daydream.V1 小时前
逻辑回归实例问题解决(LogisticRegression)
算法·机器学习·逻辑回归
代码无bug抓狂人1 小时前
C语言之表达式括号匹配
c语言·开发语言·算法
不穿格子的程序员2 小时前
从零开始写算法——普通数组篇:缺失的第一个正数
算法·leetcode·哈希算法