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

2024-09-08 15:04

本文主要是介绍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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1148440

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

poj 3723 kruscal,反边取最大生成树。

题意: 需要征募女兵N人,男兵M人。 每征募一个人需要花费10000美元,但是如果已经招募的人中有一些关系亲密的人,那么可以少花一些钱。 给出若干的男女之间的1~9999之间的亲密关系度,征募某个人的费用是10000 - (已经征募的人中和自己的亲密度的最大值)。 要求通过适当的招募顺序使得征募所有人的费用最小。 解析: 先设想无向图,在征募某个人a时,如果使用了a和b之间的关系

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

poj 3258 二分最小值最大

题意: 有一些石头排成一条线,第一个和最后一个不能去掉。 其余的共可以去掉m块,要使去掉后石头间距的最小值最大。 解析: 二分石头,最小值最大。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <c

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回