【算法训练-动态规划 五】【二维DP问题】最大正方形

news2024/9/27 12:11:24

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【动态规划】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公司+最近一年+出现频率排序,由高到低的去牛客TOP101去找,只有两个地方都出现过才做这道题(CodeTop本身汇聚了LeetCode的来源),确保刷的题都是高频要面试考的题。
在这里插入图片描述

明确目标题后,附上题目链接,后期可以依据解题思路反复快速练习,题目按照题干的基本数据结构分类,且每个分类的第一篇必定是对基础数据结构的介绍

最大正方形【MID】

来解决一道最大正方形的题目

题干

在这里插入图片描述

解题思路

原题解出处按照动态规划的标准解题讨论来进行解题,理解 min(上, 左, 左上) + 1,如题,在其他动态规划方法的题解中,大都会涉及到下列形式的代码:

// 伪代码
if (matrix(i , j ) == '1') {
    dp(i, j) = min(dp(i - 1, j), dp(i, j - 1), dp(i - 1, j - 1)) + 1;
}

其中,dp(i, j) 是以 matrix(i , j )右下角 的正方形的最大边长

若某格子值为 1,则以此为右下角的正方形的、最大边长为:上面的正方形、左面的正方形或左上的正方形中,最小的那个,再加上此格

先来阐述简单共识

  • 若形成正方形(非单 1),以当前为右下角的视角看,则需要:当前格、上、左、左上都是 1
  • 可以换个角度:当前格、上、左、左上都不能受 0 的限制,才能成为正方形

在这里插入图片描述
上面详解了 三者取最小 的含义:

  • 图 1:受限于左上的 0
  • 图 2:受限于上边的 0
  • 图 3:受限于左边的 0

数字表示:以此为正方形右下角的最大边长;黄色表示:格子 ? 作为右下角的正方形区域。就像 木桶的短板理论 那样——附近的最小边长,才与 ? 的最长边长有关。 此时已可得到递推公式

// 伪代码
if (grid[i][j] == '1') {
    dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1;
}

1 定义状态(定义子问题)

dp 具体定义:dp[i ][j ] 表示 「以第 i 行、第 j 列为右下角的正方形的最大边长」

为何不是 dp[i][j],回到图解中,任何一个正方形,我们都「依赖」当前格 左、上、左上三个方格的情况,但第一行的上层已经没有格子,第一列左边已经没有格子,需要做特殊 if 判断来处理,为了代码简洁,我们 假设补充 了多一行全 ‘0’、多一列全 ‘0’

2 状态转移方程(描述子问题之间的联系)

取自己左上、上方、左边最小值再加上自身

// 伪代码
if (grid[i][j] == '1') {
    dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1;
}

3 初始化状态

初始值就是将第一列 dp[row][0] 、第一行 dp[0][col] 都赋为 0,相当于已经计算了所有的第一行、第一列的 dp 值
在这里插入图片描述

4 求解方向

这里采用自底向上,从最小的状态开始求解

5 找到最终解

题目要求面积。根据 「面积 = 边长 x 边长」可知,我们只需求出 最大边长 即可,定义 maxSide 表示最长边长,每次得出一个 dp,就 maxSide = max(maxSide, dp); 最终返回 return maxSide * maxSide;

代码实现

给出代码实现基本档案

基本数据结构数组
辅助数据结构
算法动态规划
技巧

其中数据结构、算法和技巧分别来自:

  • 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
  • 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
  • 技巧:双指针、滑动窗口、中心扩散

当然包括但不限于以上

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型一维数组
     */
    public int maximalSquare(char[][] matrix) {

        // 1 入参校验
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return 0;
        }
        // 2 定义最长边,以及获取边长
        int maxSide = 0;
        int row = matrix.length;
        int col = matrix[0].length;

        // 3 定义dp数组,dp[i][j]表示以i、j为坐标的元素作为右下角的最大正方形边长,默认初始化了两列0
        int[][] dp = new int[row + 1][col + 1];

        // 4 编写状态转移方程
        for (int i = 1; i <= row; i++) {
            for (int j = 1; j <= col; j++) {
                if (matrix[i - 1][j - 1] == '1') {
                    dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
                    maxSide = Math.max(maxSide, dp[i][j]);
                }
            }
        }
        return maxSide * maxSide;
    }
}

考虑到每个方格都需要参与计算,双重循环要从索引1开始(否则dp[0][0]无法进行状态转移,会数组越界),这样为了第0行第0列可以参与计算,就给dp数组补了0,也就是base case,补0后dp的第1行和第1列对应的判断元素其实是matrix的第0行和第0列,所以这里的if条件是:matrix[i - 1][j - 1] == '1'

复杂度分析

时间复杂度:O(N^2),这里 N 是数组的长度,我们写了两个 for 循环,每个 for 循环的时间复杂度都是线性的;
空间复杂度:O(N),要使用和输入数组长度相等的状态数组,因此空间复杂度是 O(N)。

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

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

相关文章

Kafka - 深入了解Kafka基础架构:Kafka的基本概念

文章目录 Kafka的基本概念 Kafka的基本概念 我们首先了解一些Kafka的基本概念。 1&#xff09;Producer &#xff1a;消息生产者&#xff0c;就是向kafka broker发消息的客户端2&#xff09;Consumer &#xff1a;消息消费者&#xff0c;向kafka broker获取消息的客户端3&…

如何避免Web3诈骗,重点关注这5个安全标识提醒

从预付费电子邮件到网络钓鱼攻击&#xff0c;互联网充斥着各种骗局。尽管区块链内置了加密功能&#xff0c;但它们也遭受了相当多的恶意攻击并被获取了对帐户的访问权限。幸运的是&#xff0c;大多数诈骗攻击都有特定的安全标识提醒&#xff0c;精明的用户可以留意&#xff0c;…

淘宝商品详情API接口,解决滑块问题

淘宝商品详情API接口是一种用于获取淘宝商品详细信息的接口&#xff0c;它可以帮助开发者在自己的网站或应用程序中快速获取淘宝商品的详细信息&#xff0c;包括价格、图片、商品描述等。 该接口的主要作用包括&#xff1a; 商品信息展示&#xff1a;通过淘宝商品详情API接口…

网络协议--IGMP:Internet组管理协议

13.1 引言 12.4节概述了IP多播给出&#xff0c;并介绍了D类IP地址到以太网地址的映射方式。也简要说明了在单个物理网络中的多播过程&#xff0c;但当涉及多个网络并且多播数据必须通过路由器转发时&#xff0c;情况会复杂得多。 本章将介绍用于支持主机和路由器进行多播的In…

wkhtmltoimage/wkhtmltopdf 使用实践

1. 介绍 wkhtmltopdf/wkhtmltoimage 用于将简单的html页面转换为pdf或图片&#xff1b; 2.安装 downloads 2.1. mac os 下载64-bit 版本然后按照指示安装, 遇到 untrust developers 时&#xff0c;需要在 Settings -> Privacy 处信任下该安装包。 2.2. debian # 可用…

[AutoSar NVM] 存储架构

依AutoSAR及公开知识辛苦整理&#xff0c;禁止转载。 专栏 《深入浅出AutoSAR》&#xff0c; 全文 2900 字. 图片来源&#xff1a; 知乎 汽车的ECU内存中有很多不同类型的变量&#xff0c;这些变量包括了车辆各个系统和功能所需的数据。大部分变量在ECU掉电后就会丢失&#x…

AnkiPDF Guru软件评测:打开全新学习方式的大门

在当今信息爆炸的时代&#xff0c;如何高效学习和记忆成为了每个人关注的焦点。AnkiPDF Guru软件作为结合了Anki和PDF的学习利器&#xff0c;向我们展示了一种全新的学习方式。本文将以软件的实用性和使用场景为切入点&#xff0c;从专业的角度客观分析和评测该软件&#xff0c…

3.2.6:工作表的VBA操作引申

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。 如果…

【毕业设计】基于SSM酒店后台管理系统

前言 &#x1f525;本系统可以选作为毕业设计&#xff0c;运用了现在主流的SSM框架&#xff0c;采用Maven来帮助我们管理依赖&#xff0c;所选结构非常合适大学生所学的技术&#xff0c;本系统结构简单&#xff0c;容易理解&#xff01;本系统功能结构完整&#xff0c;非常高适…

express session JWT JSON Web Token

了解 Session 认证的局限性 Session 认证机制需要配合 cookie 才能实现。由于 Cookie 默认不支持跨域访问&#xff0c;所以&#xff0c;当涉及到前端跨域请求后端接口的时候&#xff0c;需要做很多额外的配置&#xff0c;才能实现跨域 Session 认证。 注意&#xff1a; 当前端…

rust学习—— 复合类型结构体、复合类型枚举、复合类型元组

文章目录 复合类型元组用模式匹配解构元组用点来访问元组元组的使用示例 复合类型结构体结构体定义结构体语法创建结构体实例访问结构体字段简化结构体创建结构体更新语法 结构体的内存排列元组结构体(Tuple Struct)单元结构体(Unit-like Struct)结构体数据的所有权打印结构体 …

k8s kubeadm配置

master 192.168.41.30 docker、kubeadm、kubelet、kubectl、flannel node01 192.168.41.31 docker、kubeadm、kubelet、kubectl、flannel node02 192.168.41.32 do…

springboot配置redis

1.Jedis库 依赖库 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0.2</version> </dependency>使用案例&#xff1a; Testpublic void jedis(){Jedis jedis new Jedis("127…

【Java 进阶篇】Java Servlet URL Patterns 详解

Java Servlet 是构建动态 Web 应用程序的关键组件之一&#xff0c;而 URL Patterns&#xff08;URL 模式&#xff09;则是定义 Servlet 如何响应不同 URL 请求的重要部分。在本文中&#xff0c;我们将深入探讨 Java Servlet URL Patterns 的各个方面&#xff0c;适用于初学者&a…

谢谢大家!

注&#xff1a;此篇都是真心话&#xff01; 谢谢各位对我长久以来的支持&#xff0c;感谢感谢&#xff01; 感谢各位把我的阅读量提升到21487&#xff01; 感谢各位把我的排名提升到24916&#xff08;灰长前&#xff0c;干到前1000我发超长文章&#xff09;&#xff01; 感谢…

会声会影2023永久稳定绿色汉化中文版安装包下载

会声会影2023操作简单&#xff0c;功能同样强大&#xff01;会声会影附带上百种特效、滤镜、转场、模板。同时各类专业级视频工具&#xff0c;如调色、遮罩、绿幕抠像、运动追踪、分屏创建器&#xff0c;满足更高标准的视频需求。这款软件上手操作简单易学&#xff0c;就算你在…

已更新!宝藏教程!MYSQL-第六章节多表查询(一对一,多对多,一对多),连接查询(内,外连接),联合查询,子查询 代码例题详解这一篇就够了(附数据准备代码)

c知识点合集已经完成欢迎前往主页查看&#xff0c;点点赞点点关注不迷路哦 点我进入c第一章知识点合集 MYSQL第一章节DDL数据定义语言的操作----点我进入 MYSQL第二章节DDL-数据库操作语言 DQL-数据查询语言----点我进入 MYSQL第三章节DCL-管理用户&#xff0c;控制权限----点我…

windows安装数据库MySQL

windows安装数据库MySQL 文章目录 windows安装数据库MySQL一、MySQL官网下载压缩包二、在D盘新建文件夹D:\MySQL&#xff0c;将下载的压缩包解压到该文件夹下三、配置环境变量四、通过命令行模式安装、启用、配置SQL服务 一、MySQL官网下载压缩包 下载地址&#xff1a;https:/…

Unity ShaderGraph 必会,实用的渐变滑条

常用来做一下区分不同区间部位的区别 G 对应的是 UV 的垂直轴Y R 对应的是 UV 的水平轴X 举个例子&#xff1a; 是不是层次感立马就不一样了呀&#xff0c;嘻嘻嘻嘻嘻嘻嘻 加了渐变的&#xff1a; 没有加渐变的&#xff1a;

C# 图解教程 第5版 —— 第7章 深入理解类

文章目录 7.1 类成员7.2 成员修饰符的顺序7.3 实例类成员&#xff08;*&#xff09;7.4 静态字段&#xff08;*&#xff09;7.5 从类的外部访问静态成员7.5.1 静态字段示例7.5.2 静态成员的生存期 7.6 静态函数成员7.7 其他静态类成员类型7.8 成员常量7.9 常量与静态量7.10 属性…