【LeetCode】最大正方形 [M](动态规划)

news2024/11/26 3:31:35

221. 最大正方形 - 力扣(LeetCode)

一、题目

在一个由 '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

提示:

  1. m == matrix.length
  2. n == matrix[i].length
  3. 1 <= m, n <= 300
  4. matrix[i][j] 为 '0' 或 '1'

二、代码

class Solution {
    public int maximalSquare(char[][] matrix) {
        int n = matrix.length;
        int m = matrix[0].length;
        // dp[i][j]:正方形必须以(i,j)位置作为右下角,所有可能的正方形里最大的内部全是1的正方形边长有多长
        int[][] dp = new int[n][m];
        // 记录当前收集到的最大正方形的边长
        int max = 0;

        // 赋初值
        // 第一行和第一列的格子作为正方形的右下角,一定最多只能形成边长为1的正方形
        for (int j = 0; j < m; j++) {
            // 如果这个位置为1,那么形成的最大正方形边长就是1
            dp[0][j] = matrix[0][j] == '1' ? 1 : 0;
            // 同步更新max
            if (max < dp[0][j]) {
                max = 1;
            }
        }
        for (int i = 1; i < n; i++) {
            // 如果这个位置为1,那么形成的最大正方形边长就是1
            dp[i][0] = matrix[i][0] == '1' ? 1 : 0;
            // 同步更新max
            if (max < dp[1][0]) {
                max = 1;
            }
        }

        // 构造dp数组
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                // 如果当前位置是1,再从左边、上边、左上角三个正方形中求最小正方形的边长是多少,假设是a,那么当前位置的最大正方形边长就是a+1
                // 如果当前位置不是1,那么无法以该位置为正方形的右下角来形成一个内部都是1的正方形,所以边长为0
                dp[i][j] = matrix[i][j] == '1' ? Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1 : 0;
                // 更新max
                if (max < dp[i][j]) {
                    max = dp[i][j];
                }
            }
        }
        // 返回最大面积
        return max * max;
    }
}

三、解题思路 

找到全是1的正方形,最大的那个边长有多长。

dp[i][j]:正方形必须以(i,j)位置作为右下角,所有可能的正方形里最大的内部全是1的正方形边长有多长。

例如:dp[2][5] = 3:表示以(2,5)位置为右下角的正方形中,最大的内部全是1的正方形边长为3。

正方形必须以(i,j)位置作为右下角

把每一个位置作为正方形右下角的情况下,最大能有多大都求出来,在dp中求个max答案就出来了。

状态转移策略:

可以用当前位置的左边最大,上面最大和左上角最大的正方形推出以当前位置为右下角的内部都是1的正方形最大是多少。

如果当前位置是1,再从左边、上边、左上角三个正方形中求最小正方形的边长是多少,假设是a,那么当前位置的最大正方形就是(a + 1)*(a + 1)。

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

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

相关文章

从零实现WebRTC(二):WebRTC的通信过程

文章目录一、WebRTC需要解决的问题二、ICE(Interactive Connectivity Establishment)三、ICE的详细步骤四、知识点四一、WebRTC需要解决的问题 WebRTC是由google提出的的一个用于端到端实现p2p音视频通信的框架。比起其他的hls, http-flv等直播方案&#xff0c;webrtc在公网的…

ChatGPT的来源-InstructGPT论文简要介绍

文章目录前言一、ChatGPT是什么&#xff1f;二、ChatGPT的前身InstructGPT论文解读论文下载地址&#xff1a;主要内容&#xff1a;模型训练数据类型结果效果示例总结前言 现在大火的ChatGPT功能十分强大&#xff0c;不仅可以回答用户问题&#xff0c;编写故事&#xff0c;甚至…

Spring Cloud Alibaba Sentinel 熔断降级与OpenFeign整合

熔断降级 概述 对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块&#xff0c;可能是另外的一个远程服务、数据库&#xff0c;或者第三方 API 等。例如&#xff0c;支付的时候&#xff0c;可能需要远程调用银联提供的 API&…

关于基线长度对双天线GNSS测姿精度的影响

文章目录一、GNSS测姿原理1. 载波相位双差求解基线向量2. GNSS姿态角表示二、基线长度对GNSS测姿精度的影响三、GNSS定向产品精度描述实例四、参考文献在GNSS定向模块或者板卡的指标参数中&#xff0c;我们一般会看到航向的测量精度和基线的长度相关。在实际使用&#xff0c;用…

Python if else条件语句详解

在刚学习 Python 的时候&#xff0c;我们看到的代码都是顺序执行的&#xff0c;也就是先执行第1条语句&#xff0c;然后是第2条、第3条……一直到最后一条语句&#xff0c;这称为顺序结构。 但是对于很多情况&#xff0c;顺序结构的代码是远远不够的&#xff0c;比如一个程序限…

BERT在CNN上也能用?看看这篇ICLR Spotlight论文丨已开源

如何在卷积神经网络上运行 BERT&#xff1f;你可以直接用 SparK —— 字节跳动技术团队提出的提出的稀疏层次化掩码建模 ( Designing BERT for Convolutional Networks: Sparse and Hierarchical Masked Modeling )&#xff0c;近期已被人工智能顶会 ICLR 2023 收录为 Spotligh…

论文投稿指南——中文核心期刊推荐(植物保护)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

JavaScript原型、原型链、原型方法

文章目录原型和原型链prototype、 __ proto __ 、constructor原型链原型方法instanceOfhasOwnPropertyObject.create()、new Object()总结原型和原型链 prototype、 __ proto __ 、constructor 首先我们看下面一段代码 // 构造函数Personfunction Person(name, age) {this.na…

无法访问org.springframework.boot.SpringApplication

问题 更新idea版本后使用过程中发生下面的错误 Error:(3, 32) java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: D:\maven-repository\org\springframework\boot\spring-boot\3.0.0\spring-boot-3.0.0.jar(org/springframework/boot/SpringApplicati…

【ChatGPT】如何使用python调用ChatGPT API?

是什么ChatGPT&#xff1f; ChatGPT 是由 OpenAI 开发的一个语言模型。OpenAI 是一家领先的人工智能研究机构。ChatGPT 基于变换器架构&#xff0c;使用深度学习生成会话风格的文本。该模型在大量文本数据上进行训练&#xff0c;并可以针对特定任务进行微调。例如&#xff0c;它…

2023年,产业互联网八大趋势

从全世界的TO B发展线来看&#xff0c;中国的TO B企业不是脚步最快的&#xff0c;但它们却也正在通过汲取中国数字经济高速发展的养料不断成长&#xff0c;同时主动下沉&#xff0c;成为新的产业数字化的底盘&#xff0c;做撑举起未来数字中国的无名力量。 作者|皮爷 出品|…

UDS 诊断

UDS全称为Unified Diagnostic Services&#xff0c;统一的诊断服务。由ISO-14229系列标准定义。 诊断通信的过程从用户角度来看非常容易理解&#xff0c;诊断仪发送诊断请求(request)&#xff0c;ECU给出诊断响应&#xff08;response&#xff09;&#xff0c;而UDS就是为不同…

1.9实验9:配置虚链路

1.4.4实验9:配置虚链路 实验目的(1) 实现OSPF 虚链路的配置 (2) 描述虚链路的作用 实验拓扑配置虚链路实验拓扑如图1-19所示。[1] 图1-19 配置虚链路 实验步骤

第2集丨Java中的数据类型汇总

目录一、数据类型分类二、基本数据类型取值范围数据类型的转换byte和char的关系三、包装类一、数据类型分类 二、基本数据类型 取值范围 比特(bit位) : 数据运算得最小存储单位字节(byte) : 数据最小存储单位bit和byte可以互相转换得&#xff0c;1 byte 8 bit位默认情况下&am…

2023开学季哪款电容笔值得买?高品质电容笔品牌推荐

我们可以看出&#xff0c;原先的苹果电容笔的价格卖得非常昂贵。事实上&#xff0c;对于那些没有过多预算的人来说&#xff0c;平替电容笔是最好的选择。想象一下&#xff0c;一款原装的苹果电容笔&#xff0c;能够购买四款平替电容笔&#xff0c;而平替电容笔在性能上&#xf…

修改windows系统网卡的MAC地址方法

文章目录前言修改MAC地址验证MAC地址是否修改前言 工作中遇到通过绑定IP地址和MAC地址认证才能上网的网络&#xff0c;需要修改指定的IP地址和MAC地址&#xff0c;修改IP地址比较简单&#xff0c;但是MAC地址之前好像没有改过&#xff0c;浅浅的记录一下 修改MAC地址 首先打…

MicroApp初探

微前端 微前端是一种类似于微服务的架构&#xff0c;它将微服务的理念应用于浏览器端&#xff0c;即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。各个前端应用还可以独立运行、独立开发、独立部署。微前端架构与框架无关&#xff0c;每个微应用都可以使…

VMware虚拟机安装部署CentOS7+Moba远程连接+克隆(步骤)

使用VMware部署centos7操作系统 1. 打开VMware点击“创建新的虚拟机” 2.按提示逐步选择 选择NAT模式&#xff08;只要电脑能联网&#xff0c;虚拟机就能联网&#xff09; 磁盘存为单个文件 点击“使用iso映像文件”&#xff0c;选择已经下载好的镜像文件。 &#xff08;虚…

火爆全网的ChatGPT对话数据可视化,分析数据可视化的应用和发展

ChatGPT为一款由OpenAI开发的人工智能聊天软件。2022年11月30日上映。截至2023年1月底&#xff0c;其月活跃用户超过1亿&#xff0c;是有史以来增长最快的消费应用。今年AIGC&#xff08;是指利用人工智能技术来生成内容&#xff09;频繁出圈&#xff0c;先是一个基于diffusion…

【转载】Visual Studio 下载进度很慢甚至不动怎么办?

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/566305175 现在越来越多的人投身到计算机行业成为了一名码农&#xff0c;对于一个合格的码农来说能熟练的使用Visual Studio&#xff0c;Visual Studio code,idea等是很重要的&#xff0c;也有很多人在软件下载方面就遇到了难…