【算法一则】【动态规划】求二维数组可组成的最大正方形

题目

在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。

示例 1:
在这里插入图片描述

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:4

示例 2:
在这里插入图片描述

输入:matrix = [["0","1"],["1","0"]]
输出:1
示例 3:输入:matrix = [["0"]]
输出:0
提示:m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j] 为 '0' 或 '1'

题解

这道题目要求找出给定二维字符数组中最大正方形的面积。我们可以使用动态规划的方法来解决这个问题。

首先,我们定义一个辅助的二维数组dp,其中dp[i][j]表示以matrix[i-1][j-1]为右下角的最大正方形的边长。

然后,我们遍历二维数组matrix,从左上角开始,对于每个位置(i, j),如果该位置的字符为’1’,则计算以该位置为右下角的最大正方形的边长。

计算以当前位置为右下角的最大正方形的边长时,我们可以使用动态规划的思想。我们比较当前位置的左边、上边和左上角三个位置的最小边长,再加上1,即可得到以当前位置为右下角的最大正方形的边长。

在计算过程中,我们还需要维护一个变量maxSide,用于记录当前找到的最大正方形的边长。

最后,函数返回最大正方形的面积,即maxSide的平方。

算法的时间复杂度是O(m×n),其中m是二维数组的行数,n是二维数组的列数。空间复杂度是O(m×n)
O(m×n),因为我们使用了一个辅助的二维数组dp。

在这里插入图片描述

public class MaximalSquare {public int maximalSquare(char[][] matrix) {int maxSide = 0; // 记录最大正方形的边长int[][] dp = new int[matrix.length + 1][matrix[0].length + 1]; // 创建一个二维数组用于动态规划for (int i = 1; i <= matrix.length; i++) {for (int j = 1; j <= matrix[0].length; j++) {if (matrix[i - 1][j - 1] == '1') { // 如果当前位置是 '1'// 计算以当前位置为右下角的最大正方形的边长,并更新maxSidedp[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]);}}}return maxSide * maxSide; // 返回最大正方形的面积}@Testpublic void testMain() {// 测试用例1char[][] matrix = {{'1','0','1','0','0'},{'1','0','1','1','1'},{'1','1','1','1','1'},{'1','0','0','1','0'}};System.out.println(maximalSquare(matrix));// 测试用例2char[][] matrix1 = {{'0','1'},{'1','0'}};System.out.println(maximalSquare(matrix1));// 测试用例3char[][] matrix2 = {{'0'}};System.out.println(maximalSquare(matrix2));}
}

该代码实现了一个函数maximalSquare,用于计算给定二维字符数组matrix中最大正方形的面积。算法使用动态规划的思想,通过填充一个辅助的二维数组dp来记录以每个位置为右下角的最大正方形的边长。

maximalSquare函数首先初始化一个变量maxSide为0,用于记录最大正方形的边长。然后创建一个大小为(matrix.length + 1) × (matrix[0].length + 1)的二维数组dp,其中dp[i][j]表示以matrix[i-1][j-1]为右下角的最大正方形的边长。

接下来,使用两个嵌套的循环遍历二维数组matrix,从左上角开始,对于每个位置(i, j),如果该位置的字符为'1',则计算以该位置为右下角的最大正方形的边长,并更新maxSide

计算以当前位置为右下角的最大正方形的边长时,使用动态规划的思想,通过比较左边、上边和左上角三个位置的最小边长,再加上1,得到以当前位置为右下角的最大正方形的边长。

最后,函数返回最大正方形的面积,即maxSide的平方。

testMain函数是一个测试函数,用于测试maximalSquare函数的功能。它包含了三个测试用例,分别对应不同的输入情况,输出结果为最大正方形的面积。

类似问题

【算法一则】编辑距离 【动态规划】

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

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

相关文章

AutoMQ 系统测试体系揭秘

01 前言 Apache Kafka 有着比较完备的自测体系。除了常规的单元测试和集成测试以外&#xff0c;Apache Kafka 还有着 1000 的“系统集成和性能测试”&#xff08;以下简称系统测试&#xff09;。系统测试会拉起一套真实的 Kafka 集群&#xff0c;并模拟用户使用 Kafka 集群的方…

JAVA 中间件之 Mycat2

Mycat2应用与实战教程 1.Mycat2概述 1.1 什么是MyCat 官网&#xff1a; http://mycatone.top/ Mycat 是基于 java 语言编写的数据库中间件&#xff0c;是一个实现了 MySQL 协议的服务器&#xff0c;前端用户可以把它看作是一个数据库代理&#xff0c;用 MySQL 客户端工具和…

HEVC/H.265视频编解码学习笔记–框架及块划分关系

前言 由于本人在学习视频的过程中&#xff0c;觉得分块单元太多搞不清楚其关系&#xff0c;因此本文着重记录这些分块单元的概念以及关联。 一、框架 视频为一帧一帧的图像&#xff0c;其编码的主要核心是压缩空间以及时间上的冗余。因此&#xff0c;视频编码有帧内预测和帧间…

Linux 进程概念和状态

目录 一、冯诺依曼体系结构 二、操作系统 1.概念 2.理解操作系统的管理 硬件和管理 为什么要有操作系统 三、进程的概念 PCB&#xff1a; 进程的删除和子进程的创建 删除 创建子进程 四、进程的状态 七种状态&#xff1a; 实验查看部分状态&#xff1a; R&#x…

如何把为知笔记导入到Notion笔记里面

&#x1f4a1; 大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 为知笔记并不开放&#xff0c;笔记文件只能以pdf或者图片的方向导出来&#xff0c;无法与其他笔记文件相互导入导出&#xff0c;然而&#xff0c;稍…

PCF应用切换至CAAS

刚刚开通了一个公众号&#xff0c;会分享一些技术博客和自己觉得比较好的项目&#xff0c;同时会更新一些自己使用的工具和图书资料&#xff0c;后面会整理一些面试资料进行分享&#xff0c;觉得有兴趣的可以关注一下。 文章目录 前言打包镜像Dockerfile语法项目使用遇到的问题…

屎里淘金,买二手显卡不翻车指南

马上五一了&#xff0c;应该也有不少小伙伴在摩拳擦掌想装机吧&#xff1f; 但是奈何最近显卡疯涨&#xff0c;装机大头显卡还没搞定&#xff0c;想一步到位吧&#xff0c;感觉目前显卡都太贵了&#xff0c;没必要。 想向现实妥协吧&#xff0c;但是好像又有点心有不甘。 那…

测试工程师——招聘分析

测试工程师 随着互联网行业的高速发展,快速高质量的产品版本迭代成为企业始终立于不败之地的迫切需求,而在短期迭代的快节奏中,传统测试工作面对更大压力,无法持续提供高效率高质量的人力支撑,所以越来越多的企业需要技术更为全面的测试开发工程师。测试开发 本质上属于测…

【MATLAB源码-第201期】基于matlab的黏菌群优化算法(SMA)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 黏菌优化算法&#xff08;Slime Mould Algorithm, SMA&#xff09;是一种新颖的启发式优化方法&#xff0c;其灵感来源于自然界中的真菌——黏菌。这种算法模拟了黏菌在寻找食物时的行为和网络形成策略。在本文中&#xff0c…

触发器的启用和禁用

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 在 Oracle 数据库中&#xff0c;所创建的触发器可以根据情况&#xff0c;灵活修改它的状态&#xff0c;使其有效或者无效&#xff0c;即启用或者禁用。 其语法格式如下所示。…

社区新零售:重构邻里生活圈,赋能美好未来

新时代的邻里脉动 在城市的肌理中&#xff0c;社区作为生活的基本单元&#xff0c;正经历一场由新零售引领的深刻变革。社区新零售&#xff0c;以其独特的商业模式、创新的技术手段和以人为本的服务理念&#xff0c;重新定义了社区商业的边界&#xff0c;重构了邻里生活的形态…

CAD的DWG文件如何进行搜索文字

1.目的 想搜索CAD文件中的数字或文字是否存在DWG文件中。 2.方法 方式1:菜单栏 编辑→查找 方式2&#xff1a;指令格式 图纸的左下侧→命令处&#xff0c;进行输入find→再按回车enter 3.结果

开源AI智能名片商城小程序:深度解读IMC(IP、MarTech、Content)视角

在数字化浪潮中&#xff0c;私域流量的运营已成为企业不可或缺的增长引擎。而开源AI智能名片商城小程序&#xff0c;则是以一种全新的视角——IMC&#xff08;IP、MarTech、Content&#xff09;&#xff0c;为企业打开私域流量运营的新篇章。今天&#xff0c;我们就来一起深入解…

智慧农场系统 搭建重点,会用到哪些三方服务?

智慧农场小游戏的搭建重点主要集中在游戏设计、用户体验、数据安全和稳定性等方面。为了实现这些目标&#xff0c;可能会用到以下第三方服务&#xff1a; 游戏引擎和开发工具&#xff1a;使用成熟的游戏引擎和开发工具可以极大地简化开发流程&#xff0c;提高开发效率。例如&a…

stm32cubeMX智能小车蓝牙模块

本文使用的代码是 HAL 库。 文章目录 前言一、蓝牙模块介绍二&#xff0c;AT指令测试蓝牙模块三&#xff0c;原理图分析四&#xff0c;cubeMX 配置五&#xff0c;编写代码总结 前言 实验小车&#xff1a;STM32F103C8T6。 蓝牙模块&#xff1a;HC-05。 所需软件&#xff1a;kei…

Rust中的并发性:Sync 和 Send Traits

在并发的世界中&#xff0c;最常见的并发安全问题就是数据竞争&#xff0c;也就是两个线程同时对一个变量进行读写操作。但当你在 Safe Rust 中写出有数据竞争的代码时&#xff0c;编译器会直接拒绝编译。那么它是靠什么魔法做到的呢&#xff1f; 这就不得不谈 Send 和 Sync 这…

Spirng 当中 Bean的作用域

Spirng 当中 Bean的作用域 文章目录 Spirng 当中 Bean的作用域每博一文案1. Spring6 当中的 Bean的作用域1.2 singleton 默认1.3 prototype1.4 Spring 中的 bean 标签当中scope 属性其他的值说明1.5 自定义作用域&#xff0c;一个线程一个 Bean 2. 总结:3. 最后&#xff1a; 每…

Navicat 每次打开数据库时,总是弹出 “正在获取 ER 图表信息“

文章目录 1 问题描述2 问题截图3 解决办法 1 问题描述 使用 Navicat 打开数据库时&#xff0c;总是弹出 “正在获取 ER 图表信息”每次都弹出来&#xff0c;耗时长&#xff0c;有时候点 “取消” 还卡死&#xff0c;烦人 2 问题截图 获取表信息 解析为 ER 图&#xff08;最…

React正式更新!开始学习React 19!

本文为原创文章&#xff0c;原文链接&#xff1a;J实验室&#xff0c;未经授权请勿转载 今年2月份&#xff0c;React 发布消息确认今年发布 v19 版本&#xff0c;尘封两年的版本号终于要更新了&#xff08;详情点击&#xff1a;React 19 发布在即&#xff0c;抢先学习一下新特性…

打靶日记:midnight

前置 1. 下载靶机 前往https://www.vulnhub.com/&#xff0c;下载我们想要使用的靶机 本次实战使用的靶机是sunset: midnight 2. 导入VMware 我是用的是VM15&#xff0c;这里我们直接 点击文件-》打开-》选择我们下载完的文件&#xff08;如果是压缩包的话记得解压&#…