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

题目

在一个由 ‘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.hqwc.cn/news/651246.html

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

相关文章

[华为OD] 给航天器一侧加装长方形或正方形的太阳能板 100

给航天器一侧加装长方形或正方形的太阳能板&#xff08;图中的红色斜线区域&#xff09;&#xff0c;需要先安装两个支 柱&#xff08;图中的黑色竖条&#xff09;&#xff0c;再在支柱的中间部分固定太阳能板。但航天器不同位置的支柱长度 不同&#xff0c;太阳能板的安装面…

Games101-动画与模拟(基本概念、质点弹簧系统、运动学)

动画&#xff1a;把物体变成活的&#xff0c;让它动起来 更关注的是美学。早期的动画是画出来的&#xff0c;并不关心对不对&#xff0c;符不符合物理&#xff0c;只要看起来对 图形学里对动画理解为对于建模或几何的拓展。动画无非就是在不同的时间或不同的帧有不同的几何形状…

如何组织一场品牌都爱的快闪活动?

现在懂营销的品牌都爱开“快闪店”&#xff0c;据不完全统计&#xff0c;仅上半年就有超过100个品牌开设了快闪店。 不仅是服装、餐饮、美妆等适合玩快闪的品牌&#xff0c;还有像泡泡玛特、元气森林、钟薛高等新消费品牌也是重要的参与者。 快闪店其实是一种舶来品&#xff…

PS学习笔记-抠图相关

选好颜色后&#xff0c;altdelete更换画布颜色、填充前景色 按住shift键自由缩放图片&#xff0c;调好后双击鼠标即可完成&#xff0c;或者点击工具栏的 对勾 在某图层下 CTRLT 变换图片&#xff0c;调好后双击鼠标即可完成&#xff0c;或者点击工具栏的 对勾 CTRLJ复制图…

Shell脚本学习记录

0.理解Linux文件权限 0.1 Linux安全性 用户的权限是通过创建用户时分配的用户ID(UID)来追踪的&#xff0c;UID是个数值&#xff0c;每个用户都有一个唯一的UID 0.1.1 /etc/passwd文件 Linux系统使用一个专门的文件/etc/passwd来匹配登录名与对应的UID值&#xff0c;该文件包…

Jira搭建过程

看到很多小伙伴对jira有兴趣,我们今天就来分享一下jira的搭建吧 首先要明白jira是什么? 看来搭建jira也是我们测试人员需要具备的技能之一了.下面是详细的大家步骤: 1.系统环境准备 Centos 7.5 Mysql 5.6 Java1.8 2.软件安装包 atlassian-jira-software-7.13.0-x64.bin …

大模型应用开发之准备篇(OpenAI的plugins、GPTs与RAG、Agent)

今天这个章节是为了接下来我们使用大模型做应用开发做准备。 大家陆续在很多文章中可能已经看到过了很多概念&#xff0c;比如plugins、GPTs、Agent&#xff0c;这里面自ChatGPT3.5爆火以来&#xff0c;有众多的AI创业公司从不同的切入点在做&#xff0c;OpenAI公司也在不断推…

抖音小程序-小玩法(学习笔记)

现在非常流行小程序&#xff0c;当然自媒体直播也是现在最流行的&#xff0c;当我们看直播时可能看到各种的互动玩法&#xff0c;接下来我以一个开发者的角度&#xff0c;来玩玩怎么写一些小玩法 很多时候在没有玩过的东西来说最好的办法就是看用户手册,程序也一样&#xff0c;…

数据结构-二叉树-堆(二)

一、建堆的时间复杂度问题 1、除了向上调整建堆&#xff0c;我们还可以向下调整建堆。不能在根上直接开始向下调整。这里的条件就是左右子树必须都是大堆或者小堆。我们可以倒着往前走&#xff0c;可以从最后一个叶子开始调整。但是从叶子开始调整没有意义。所以我们可以从倒数…

ClickHouse 高可用之副本

文章目录 ClickHouse 副本支持副本的引擎配置高可用副本副本应用1.副本表概述2.创建副本表3.写入模拟数据4.副本验证 扩展 —— 在 Zookeeper 中查看副本表信息 ClickHouse 副本 ClickHouse 通过副本机制&#xff0c;可以将数据拷贝存储在不同的节点上。这样&#xff0c;如果一…

C语言数据类型的介绍,类型的基本归类,整型在内存中的存储,原码、反码、补码,大小端等介绍

文章目录 前言一、数据类型的介绍类型的意义 1. 类型的基本归类&#xff08;1&#xff09;. 整型家族&#xff08;2&#xff09;. 浮点数家族&#xff08;3&#xff09;. 构造类型&#xff08;4&#xff09;. 指针类型&#xff08;5&#xff09;. 空类型 二、整型在内存中的存储…

【Python系列】受保护属性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…