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;  
    }
};
相关推荐
写代码的橘子n7 分钟前
unordered_set 的常用函数
数据结构·算法·哈希算法
EnigmaCoder18 分钟前
蓝桥杯刷题周计划(第二周)
学习·算法·蓝桥杯
黑金IT22 分钟前
深入理解人脸特征向量及图片转换方法与开发架构
算法·架构
HP-Patience37 分钟前
决策树 vs 神经网络:何时使用?
神经网络·算法·决策树
AI很强38 分钟前
matlab常见的配图代码实现1
开发语言·算法·matlab
飞川00143 分钟前
🚀 力扣热题 78:子集(详细解析)
算法
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧1 小时前
C语言_数据结构总结6:链式栈
c语言·开发语言·数据结构·算法·链表·visualstudio·visual studio
田梓燊1 小时前
leetcode 95.不同的二叉搜索树 Ⅱ
数据结构·算法·leetcode
IT猿手1 小时前
2025最新群智能优化算法:云漂移优化(Cloud Drift Optimization,CDO)算法求解23个经典函数测试集,MATLAB
开发语言·数据库·算法·数学建模·matlab·机器人
commonbelive2 小时前
考研机试常见基本题型
c语言·c++·算法