LeetCode刷题之HOT100之最大正方形

今天下起了暴雨,本以为下午就可以结束的答辩又因为老师开会被推迟。研三的学长走了后我们开始了0元购,收获颇丰哈哈,做个题

1、题目描述

在这里插入图片描述

2、算法分析

给定一个矩形,要求最大正方形。第一次见这种题目哈
2024 6/30 嘿嘿,这道题我昨天没做啦,今天来做,今天中午就待实验室啦,回去太麻烦了。那么继续开始做题
我拿到这个题大概知道跟动态规划有关,然后看了题解,题解给出两种算法:暴力与DP。那么我们先来看看暴力解法
暴力法是最简单直观的做法,具体做法如下:

  1. 遍历矩阵中的每个元素,每次遇到 1,则将该元素作为正方形的左上角;
  2. 确定正方形的左上角后,根据左上角所在的行和列计算可能的最大正方形的边长(正方形的范围不能超出矩阵的行数和列数),在该边长范围内寻找只包含 1 的最大正方形;
  3. 每次在下方新增一行以及在右方新增一列,判断新增的行和列是否满足所有元素都是 1。

代码演示:

public int maximalSquare(char[][] matrix) {// 初始化最大正方形的边长为0 int maxSide = 0;// 如果矩阵为空,则直接返回0if(matrix == null || matrix.length == 0 || matrix[0].length == 0){return maxSide;}// 获取矩阵的行数和列数int rows = matrix.length, columns  = matrix[0].length;// 遍历矩阵中的每个元素  for(int i = 0; i < rows; i++){for(int j = 0; j < columns ; j++){// 如果当前元素是'1',则开始尝试以当前位置为左上角的最大正方形的边长if(matrix[i][j] == '1'){// 更新maxSide,因为至少可以形成一个边长为1的正方形maxSide = Math.max(maxSide, 1);// 计算当前位置可能形成的最大正方形的最大可能边长  // 不能超过矩阵的边界 int currentMaxSide = Math.min(rows - i, columns  - j );// 尝试从边长为1开始,逐渐扩大正方形的边长for(int k = 1; k < currentMaxSide; k++){// 假设当前边长k的正方形是可能的boolean flag = true;// 检查正方形的右下角是否为'0',如果是,则无法形成边长为k的正方形if(matrix[i + k][j + k] == '0'){break;}// 检查正方形的右侧和下方的边界是否都为'1'  // 如果有任何一个为'0',则无法形成边长为k的正方形for(int m = 0; m < k; m++){if(matrix[i + k][j + m] == '0' || matrix[i + m][j + k] == '0'){flag = false;break;}}// 如果能形成边长为k的正方形,则更新maxSideif(flag){maxSide = Math.max(maxSide, k + 1);// 如果不能形成边长为k的正方形,则无需继续尝试更大的边长}else{break;}}}}}// 计算最大正方形的面积并返回int maxSquare = maxSide * maxSide;return maxSquare;}

暴力解法的时间复杂度: O ( m n min ⁡ ( m , n ) 2 ) O(mn\min(m,n)^2) O(mnmin(m,n)2),其中 m 和 n 是矩阵的行数和列数。空间复杂度:O(1)。额外使用的空间复杂度为常数。

可以看到空间复杂度很高了,那么我们来看看动态规划是怎么解决的。

可以使用动态规划降低时间复杂度。

  • 我们用 dp(i,j) 表示以 (i,j) 为右下角,且只包含 1 的正方形的边长最大值。如果我们能计算出所有
    dp(i,j) 的值,那么其中的最大值即为矩阵中只包含 1 的正方形的边长最大值,其平方即为最大正方形的面积。
  • 那么如何计算 dp 中的每个元素值呢?对于每个位置 (i,j),检查在矩阵中该位置的值:
  • 如果该位置的值是 0,则 dp(i,j)=0,因为当前位置不可能在由 1 组成的正方形中;
  • 如果该位置的值是 1,则 dp(i,j) 的值由其上方左方左上方的三个相邻位置的 dp值决定。具体而言,当前位置的元素值等于三个相邻位置的元素中的最小值加 1,状态转移方程如下:
dp(i,j) = min(dp(i − 1,j), dp(i − 1,j − 1), dp(i,j − 1) ) + 1

此外,还需要考虑边界条件。如果 ij 中至少有一个为 0,则以位置 (i,j) 为右下角的最大正方形的边长只能是 1,因此 dp(i,j)=1

3、代码

public int maximalSquare(char[][] matrix) {// 初始化最大正方形的边长为0int maxSide = 0;// 如果矩阵为空,或者没有行或列,则直接返回0if(matrix == null || matrix.length == 0 || matrix[0].length == 0){return maxSide;}// 获取矩阵的行数和列数int rows = matrix.length, columns = matrix[0].length;// 创建一个与原始矩阵大小相同的二维dp数组,用于存储每个位置的最大正方形边长int[][] dp = new int[rows][columns];// 遍历矩阵的每一个位置for(int i = 0; i < rows; i++){for(int j = 0 ; j < columns; j++){// 如果当前位置是'1' if(matrix[i][j] == '1'){// 如果当前位置是第一行或第一列,则最大正方形边长只能是1 if(i == 0 || j == 0){dp[i][j] = 1;}else{// 否则,当前位置的最大正方形边长取决于其上方、左方和左上方的最小边长,并加1  // 因为我们要考虑的是由'1'组成的正方形dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;}// 更新最大正方形的边长maxSide = Math.max(maxSide, dp[i][j]);}               }}// 计算最大正方形的面积(边长的平方)int maxSquare = maxSide * maxSide;// 返回最大正方形的面积return maxSquare;}

这里的dp思想跟我之前做的一道最短路径思想是一样的。通过填充一个与原始矩阵大小相同的dp数组来记录每个位置的最大正方形边长。最终,返回的是最大正方形的面积,而不是边长。

4、复杂度分析

  • 时间复杂度:O(mn),其中 m 和 n 是矩阵的行数和列数。需要遍历原始矩阵中的每个元素计算 dp 的值。
  • 空间复杂度:O(mn),其中 m 和 n 是矩阵的行数和列数。创建了一个和原始矩阵大小相同的矩阵 dp。由于状态转移方程中的 dp(i,j) 由其上方、左方和左上方的三个相邻位置的 dp 值决定,因此可以使用两个一维数组进行状态转移,空间复杂度优化至 O(n)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实体零售连锁企业如何通过物流接口实现数智化转型升级?

在电子商务浪潮的持续冲击下&#xff0c;传统的实体零售行业面临着巨大的挑战。为了在线上线下融合的新零售时代保持竞争力&#xff0c;众多实体零售企业积极寻求数字化转型的突破。 某中国零售连锁百强企业近年来致力于打造自有品牌的线上销售体系&#xff0c;自2021年8月起接…

Python数据分析-风湿关节炎生存分析

一、研究背景和意义 类风湿关节炎&#xff08;RA&#xff09;是一种慢性炎症性疾病&#xff0c;主要影响关节&#xff0c;但也可能影响身体的其他部分。RA的病因尚不完全清楚&#xff0c;但已知其涉及免疫系统的异常反应。患者的免疫系统错误地攻击自身的关节组织&#xff0c;…

HCIA4.9-4.19笔记

通讯——双向的&#xff0c;必须保证有来有回才能成功。 当拓扑图中的所有路由器拥有拓扑图中的所有网段时&#xff0c;即可实现全网通。 路由器获取位置网段的方法 静态路由 由管理员手写的路由条目 动态路由 所有路由器上运行同一种动态路由协议&#xff0c;之后通过路…

低代码表单配置平台替代普通表单配置平台,前端部分重构的设计和思路

前言 最近将公司的旧表单配置平台重构为低代码表单配置平台&#xff0c;这里记录一下这个过程的设计和思路&#xff0c;不涉及具体的代码&#xff1b;另外这篇文章基本只涉及前端部分&#xff0c;也不涉及与后端数据交互部分。 需求 固化的表单配置平台 -> 灵活的表单配置…

【最长公共前缀 动态规划】2430. 对字母串可执行的最大删除数

如果有不明白的&#xff0c;请加文末QQ群。 本文涉及知识点 最长公共前缀 动态规划 动态规划汇总 LeetCode 2430. 对字母串可执行的最大删除数 给你一个仅由小写英文字母组成的字符串 s 。在一步操作中&#xff0c;你可以&#xff1a; 删除 整个字符串 s &#xff0c;或者 …

vscode中的字符缩进问题

问题描述&#xff1a; 如图当一行代码中出现不同类型的字符时&#xff0c;使用tab缩只是插入了固定数量&#xff08;默认4&#xff09;的空格或制表符&#xff0c;仍然无法对齐。 解决方法&#xff1a; vscode找到设置&#xff0c;搜索fontFamily&#xff0c;对应输入框写入mon…

Linux系统编程--进程间通信

目录 1. 介绍 1.1 进程间通信的目的 1.2 进程间通信的分类 2. 管道 2.1 什么是管道 2.2 匿名管道 2.2.1 接口 2.2.2 步骤--以父子进程通信为例 2.2.3 站在文件描述符角度-深度理解 2.2.4 管道代码 2.2.5 读写特征 2.2.6 管道特征 2.3 命名管道 2.3.1 接口 2.3.2…

集成平台建设方案(Doc原件)

基础支撑平台作为系统总体架构的核心&#xff0c;不仅要促进与各应用子系统和第三方系统的顺畅交互&#xff0c;还需确保内部业务在该平台上能够灵活扩展。针对这一需求&#xff0c;我们对基础支撑平台提出了以下要求&#xff1a; (1) 平台需基于其基础架构&#xff0c;为多源异…

python基础:设置代码格式

随着编写的程序越来越长&#xff0c;有必要了解一些代码格式的约定&#xff0c;让你的代码尽可以能易于阅读。 python代码编写规范为PEP8&#xff0c;有兴趣的朋友可以下载观看&#xff0c;这里仅作简要说明。 1、缩进 PEP8建议每级缩进都使用4个空格。多数情况下编程语言的…

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定…

UE5的安装与基本操作(一)

文章目录 前言安装UE5新建第一个游戏项目基本游览方式对目标进行变换各种变换对齐 快速定位目标 总结 前言 Unreal Engine 5 (UE5) 是一款由 Epic Games 开发的实时 3D 创作平台&#xff0c;用于制作游戏、电影、动画、建筑可视化和其他类型的交互式体验。UE5 提供了一系列强大…

Flutter第十五弹 Flutter插件

目标&#xff1a; 1.Flutter插件是什么&#xff1f;有什么作用&#xff1f; 插件 (plugin) 是 package 的一种&#xff0c;全称是 plugin package&#xff0c;我们简称为 plugin&#xff0c;中文叫插件。 2.怎么创建Flutter插件&#xff1f; 一、什么是插件 在flutter中&am…

【成都活动邀请函】7月6 | PowerData 数字经济-“成都“开源行!

【成都活动邀请函】7月6 | PowerData 数字经济-"成都"开源行&#xff01; 活动介绍活动信息线上直播扫码报名往期活动回顾专注数据开源&#xff0c;推动大数据发展 活动介绍 九天开出一成都&#xff0c;万户千门入画图。 自古以来&#xff0c;成都便是国家发展的重要…

第2章-Python编程基础

#本章目标 1&#xff0c;了解什么是计算机程序 2&#xff0c;了解什么是编程语言 3&#xff0c;了解编程语言的分类 4&#xff0c;了解静态语言与脚本语言的区别 5&#xff0c;掌握IPO程序编写方法 6&#xff0c;熟练应用输出函数print与输入函数input 7&#xff0c;掌握Python…

【机器学习】机器学习的重要技术——生成对抗网络:理论、算法与实践

引言 生成对抗网络&#xff08;Generative Adversarial Networks, GANs&#xff09;由Ian Goodfellow等人在2014年提出&#xff0c;通过生成器和判别器两个神经网络的对抗训练&#xff0c;成功实现了高质量数据的生成。GANs在图像生成、数据增强、风格迁移等领域取得了显著成果…

leetCode.97. 交错字符串

leetCode.97. 交错字符串 题目思路 代码 class Solution { public:bool isInterleave(string s1, string s2, string s3) {int n s1.size(), m s2.size();if ( s3.size() ! n m ) return false;vector<vector<bool>> f( n 1, vector<bool> (m 1));s1 …

Sparse4D v3: Advancing End-to-End 3D Detection and Tracking

Sparse4D v3: Advancing End-to-End 3D Detection and Tracking 相关内容&#xff1a;总览&#xff0c;Sparse4D v1&#xff0c;Sparse4D v2&#xff0c; 单位&#xff1a;地平线(Sparse4D v1 v2 原班人马) GitHub&#xff1a;https://github.com/HorizonRobotics/Sparse4D …

昇思25天学习打卡营第5天 | 网络构建

目录 1.定义模型类 2.模型层 nn.Flatten nn.Dense nn.ReLU nn.SequentialCell nn.Softmax 3.模型参数 代码实现&#xff1a; 总结 神经网络模型是由神经网络层和Tensor操作构成的&#xff0c; mindspore.nn提供了常见神经网络层的实现&#xff0c; 在MindSpore中&a…

AI智能客服项目拆解(1) 产品大纲

本文作为拆解AI智能客服项目的首篇&#xff0c;以介绍产品大纲为主。后续以某AI智能客服产品为例&#xff0c;拆解相关技术细节。 AI智能客服是一种基于人工智能技术的客户服务解决方案&#xff0c;旨在提高客户满意度和优化企业运营。利用人工智能和自然语言处理技术&#xff…

MySQL之索引失效的情况

什么情况下索引会失效&#xff1f; 违反最左前缀原则范围查询右边的列不能使用索引不要在索引列上进行运算操作字符串不加单引号导致索引失效以%开头的like模糊查询 什么情况下索引会失效&#xff1f; 示例&#xff0c;有user表如下 CREATE TABLE user (id bigint(20) NOT NU…