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 得到:

  • dpi-1j
  • dpij-1
  • dpi-1j-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;  
    }
};
相关推荐
旖-旎9 分钟前
LeetCode 494:目标和(动态规划/01背包问题)—— 题解
c++·算法·leetcode·动态规划·01背包
spssau20 分钟前
一文学会结构方程模型:从模型搭建、路径图绘制到不达标调整,实操全流程
人工智能·python·算法
zzz_236833 分钟前
【Java实习面试算法冲刺】总复盘
java·算法·面试
DFT计算杂谈1 小时前
DeepSeek 集群服务器无root本地部署指南
数据库·人工智能·python·opencv·算法
qq_454245031 小时前
GraphFoundation — 通用图基础框架
算法·架构
不一样的故事1262 小时前
军工行业合规与基础认知
数据结构·经验分享·算法
圣保罗的大教堂7 小时前
leetcode 3867. 数对的最大公约数之和 中等
leetcode
To_OC9 小时前
LC 15 三数之和:双指针不难,难的是把去重做对
javascript·算法·leetcode
renhongxia112 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
G.O.G.O.G12 小时前
LeetCode SQL 从入门到精通(MySQL)06(上)
数据库·sql·mysql·leetcode