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

news2024/11/25 23:01:18

题目

在一个由 ‘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'
                    // 计算以当前位置为右下角的最大正方形的边长,并更新maxSide
                    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]);
                }
            }
        }
        return maxSide * maxSide; // 返回最大正方形的面积
    }

    @Test
    public void testMain() {
        // 测试用例1
        char[][] 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));

        // 测试用例2
        char[][] matrix1 = {
            {'0','1'},
            {'1','0'}
        };
        System.out.println(maximalSquare(matrix1));

        // 测试用例3
        char[][] 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.coloradmin.cn/o/1626123.html

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

相关文章

为何鸿蒙开发成为求职市场的香饽饽 ?

在当今社会&#xff0c;技术的快速发展与更新迭代使得职场竞争愈发激烈。对于求职者来说&#xff0c;掌握一门热门且前景广阔的技术&#xff0c;无疑是获得理想工作的关键。鸿蒙开发&#xff0c;作为华为自主研发的操作系统开发技术&#xff0c;正逐渐成为求职市场的热门选择。…

手搓单链表(无哨兵位)(C语言)

目录 SLT.h SLT.c SLTtest.c 测试示例 单链表优劣分析 SLT.h #pragma once#include <stdio.h> #include <assert.h> #include <stdlib.h>typedef int SLTDataType;typedef struct SListNode {SLTDataType data;struct SListNode* next; }SLTNode;//打印…

触发器的基本概念及分类

目录 触发器的基本概念 作用对象 触发事件 触发条件 触发时间 触发级别或者触发频率 触发器的分类 DML 触发器 INSTEAD OF 触发器 系统触发器 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 触发器的基本概念 …

表格的单元格合并和表头的合并——vxe-table

vxe-table的官网&#xff1a;https://vxetable.cn/#/table/advanced/mergeCell在你的项目中下载安装完成后&#xff0c;先在main.js文件中引入&#xff1a; import VXETable from vxe-table import vxe-table/lib/style.css Vue.use(VXETable)一、单元格合并 效果图&#xff…

2024年【安全生产监管人员】考试技巧及安全生产监管人员模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【安全生产监管人员】考试技巧及安全生产监管人员模拟考试&#xff0c;包含安全生产监管人员考试技巧答案和解析及安全生产监管人员模拟考试练习。安全生产模拟考试一点通结合国家安全生产监管人员考试最新大纲…

Java | Leetcode Java题解之第50题Pow(x,n)

题目&#xff1a; 题解&#xff1a; class Solution {public double myPow(double x, int n) {long N n;return N > 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);}public double quickMul(double x, long N) {if (N 0) {return 1.0;}double y quickMul(x, N / 2);retu…

大数据开发详解

点击下载《大数据开发详解》 1. 前言 随着信息化时代的快速发展&#xff0c;大数据已经成为了企业和组织不可或缺的重要资源。大数据开发则是指通过一系列技术手段&#xff0c;对海量数据进行收集、存储、处理、分析和挖掘&#xff0c;以实现数据的价值化利用。大数据开发涉及…

进口透明可视耐腐蚀PFA进样管特氟龙圆底试管适配MC-ICP-MS

PFA进样管可适配Neptune plus多接收器等离子质谱仪&#xff08;MC-ICP-MS&#xff09;&#xff0c;广泛应用于地球化学、核保障、环境科学、金属组学领域&#xff0c;在生物、物理、化学、材料等多个学科的交叉方向也有良好的应用前景。 外观半透明&#xff0c;便于观察管内情…

YOLOV5 TensorRT部署 BatchedNMS(engine模型推理)(下)

主要是在王新宇代码的基础上改进,引入对BatchedNMS的解码 文章目录 1. 修改yolov5.cpp2.修改yololayer.h1. 修改yolov5.cpp 首先增加全局变量,名字根据转onnx时修改的节点名字来,查看onnx文件可以看到,顺序不要弄错。 const char *INPUT_NAME = “images”; const char …

基于深度学习的实时人脸检测与情绪分类

情绪分类 实时人脸检测与情绪分类 Kaggle Competion 数据集 fer2013 中的测试准确率为 66%CK数据集的检验准确率为99.87%情绪分类器模型预测从网络摄像头捕获的实时视频中的平均成本时间为 4~ 10ms 关键技术要点&#xff1a; 实时人脸检测&#xff1a;系统采用了前沿的人脸检…

提交链码-编辑前后端,调用链码功能

一 . 链码介绍 1.什么链码&#xff1f; • 链码是一段用 Go、Node.js 或者 Java 实现了规定接口的程序。链码在安全的Docker容器中运行&#xff0c; 与背书节点的进程隔离。通过应用程序提交的交易&#xff0c;链码初始化和管理账本状态。• 链码通常处理网络成员协商达成的业…

vue下载文件时显示进度条

1.单个下载&#xff08;开始是导出按钮 下载显示进度条&#xff09; html <el-button click.stop"exportReport(scope.row, scope.index)" v-if"!scope.row.schedule" icon"el-icon-download"size"small" type"text"styl…

2023最新!MySQL8于win10环境下的安装配置保姆级教程

2023最新&#xff01;MySQL8于win10环境下的安装配置保姆级教程 MySQL官网&#xff1a;https://www.mysql.com/downloads/ 导航 文章目录 2023最新&#xff01;MySQL8于win10环境下的安装配置保姆级教程导航一、MySQL下载二、安装MySQLchoosing a Setup Typeselect products…

软件测试面试题(三)

Selenium 相关Selenium 基础什么是 Selenium&#xff1f;什么是 Selenium WebdriverS 什么是 elenium IDE&#xff1f;常用自动化测试工具机器运行原理&#xff0c;写出一段元素查找的代码&#xff1f;如何开展自动化测试框架的构建&#xff1f;如何设计自动化测试用例webdrive…

Angular 由一个bug说起之五:为什么现代CSS系统倾向于少用或不用absolute定位?

在现代网页设计中&#xff0c;CSS&#xff08;层叠样式表&#xff09;是不可或缺的一部分。在过去&#xff0c;使用position: absolute定位元素是一种常见的技术&#xff0c;但是随着前端开发的发展&#xff0c;现代CSS系统倾向于减少或避免使用absolute定位。本文将探讨这一趋…

上班族必备的便签备忘录app 好用的便签备忘录软件

上班族每天都需要处理大量的工作事项&#xff0c;从策划方案到客户沟通&#xff0c;每一个环节都至关重要。然而&#xff0c;仅仅依靠大脑记忆&#xff0c;很容易遗漏某些细节&#xff0c;甚至可能错过重要的截止日期。为了避免这种情况&#xff0c;许多人选择使用一款优秀的便…

NATAPP内网穿透工具安装和使用教程

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 必须要按照先操作完第一步 再操作第二步骤下载教程 1.进入网址注册&#xff1a;NATAPP - 2.下载网址&#xff1a;NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 流程 注册NATAPP 实名认证通过之后…

学习笔记Label自右向左滚动和父容器内左右移动方法(含代码)

一、【滚动效果】 【radialMenu1控件】菜单切换浏览器和控制台 需要定时器Timer&#xff08;默认属性EnabledFalse,Interval100&#xff09; 二、【方法1和方法2&#xff0c;通过属性切换开关和方向】 try{if (myObject.TextScrollSwitch){//打开移动if(myObject.TextScroll…

固态继电器:推进可再生能源系统

随着可再生能源系统的发展&#xff0c;太阳能系统日益成为现代能源解决方案的先锋。在这种背景下&#xff0c;固态继电器&#xff08;SSR&#xff09;&#xff0c;特别是光耦固态继电器的利用变得日益突出。本文旨在深入探讨SSR在可再生能源系统中的多方位应用&#xff0c;重点…

echarts利用graphic属性给饼图添加内圈图片及外圈图片(可自适应宽度位于饼图中心)

最终效果图&#xff1a; 目录 前言资源主要部分graphic介绍style介绍代码 加载饼图方法&#xff08;option所有的配置&#xff09; 前言 思路是看到这个博客启发的&#xff1a;点击跳转查看博客&#xff0c;然后在graphic属性里改了我的实际需求&#xff0c;譬如图片的宽高、…