本文主要是介绍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版本
func maximalSquare(matrix [][]byte) int {n:=len(matrix)m:=len(matrix[0])dp:=make([][]int,n)res:=0for i:=range dp{dp[i]=make([]int,m)if(matrix[i][0]=='1'){dp[i][0]=1res=1}}for j:=0;j<m;j++{if(matrix[0][j]=='1'){dp[0][j]=1res=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版本
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=1dp[i][0]=1for j in range(m):if matrix[0][j]=='1':res=1dp[0][j]=1for 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])+1res=max(res,dp[i][j])return res*res
C++版本
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; }
};
这篇关于LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!