【动态规划Ⅴ】二维数组的动态规划——0/1矩阵、最大正方形

二维数组的动态规划——0/1矩阵、最大正方形

  • 最大正方形
    • 1277. 统计全为 1 的正方形子矩阵
    • 221. 最大正方形
  • 01矩阵
    • 542. 01 矩阵

最大正方形

下面两个题目是非常相似的,只是一个统计正方形数目,一个统计最大正方形的面积。

1277. 统计全为 1 的正方形子矩阵

1277. 统计全为 1 的正方形子矩阵

给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。

首先,如果矩阵matrix[i][j] = 1,那么就是一个大小为1的正方形。假设用二维数组dp进行统计,dp[i][j]即以matrix[i][j]为右下顶点的全是1组成的正方形的个数【其实也是以matrix[i][j]为右下点的全是由1组成的正方形的最大边长,最大正方形】。
我们从大小为1的正方形开始,要解决的问题是这个正方形如何扩大?根据官方题解中的图,很好理解,dp[i][j]与其上面、左边和左上三个角,且由其中最小的一个决定,即dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1, matrix[i][j] +1
在这里插入图片描述
可以先处理第一列和第一行,只要matrix[i][j]为1,dp[i][j]就等于1,同时统计的正方形子矩阵数量+1。完整java代码如下:

class Solution {
    public int countSquares(int[][] matrix) {
        int rows = matrix.length, cols = matrix[0].length;
        int[][] count = new int[rows][cols];
        int sum = 0;
        //单独处理
        for(int i = 0; i < cols; i++){
            count[0][i] = matrix[0][i];
            sum += count[0][i];
        }
        //单独处理第一列
        for(int i =1; i< rows; i++){
            count[i][0] = matrix[i][0];
            sum += count[i][0];
        }

        for(int i = 1; i < rows; i++)
            for(int j = 1; j < cols; j++){
                if(matrix[i][j] == 0)
                    count[i][j] = 0;
                else
                    count[i][j] = minSan(count[i-1][j-1], count[i-1][j] , count[i][j-1]) + 1;
                
                sum += count[i][j];
            }
        return sum;
    }
   //单独写了一个函数判断三者中的最小值
   //实际用min(a,min(b,c))是一样的
    public int minSan(int a, int b ,int c){
        int minCur;
        if(a < b)
            minCur = a;
        else
            minCur = b;

        if(minCur> c)
            minCur = c;

        return minCur;
    }
}

221. 最大正方形

221. 最大正方形

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

这个题目和上面是类似的,上面的dp[i][j]是以matrix[i][j]为右下角的,全部由1组成的正方形的数量,其实也就是以matrix[i][j]为右下角的正方形的最大边长。只是这个题目找的是dp[i][j]中的最大值。 需要注意的是,这个题目中matrix[i][j]是char类型的,是’0’'1’字符而不是数字。
完整java代码如下:

class Solution {
    public int maximalSquare(char[][] matrix) {
        int ansMax = 0;
        int rows = matrix.length, cols = matrix[0].length;
        int[][] count = new int[rows][cols];

        for(int i = 0; i < rows; i++){
            for(int j = 0; j < cols; j++){
            	//第一行和第一列,特殊情况
                if( i == 0 || j == 0)
                	//'0'的ASCII码对应48
                    count[i][j] = matrix[i][j] - 48;                 
                else if(matrix[i][j] == '0')
                    count[i][j] = 0;
                else
                    count[i][j] = Math.min(Math.min(count[i-1][j-1],count[i-1][j]),count[i][j-1]) + 1;
                //更新dp[i][j]的同时,更新ansMax,记录最大的正方形面积
                ansMax = ansMax > count[i][j] ? ansMax : count[i][j];
            }
        }  
        //返回的是面积     
        return ansMax*ansMax;
    }
}

01矩阵

542. 01 矩阵

542. 01 矩阵

给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。

理解题意,是要我们找mat[i][j]离其周围的最近的0的距离,这里的周围是四个方向,上边[i-1][j]、下边[i+1][j]、左边[i][j-1]、右边[i][j+1]。如果用dp[i][j]记录这个最近距离,相当于dp[i][j] = min( dp[i-1][j], dp[i+1][j], dp[i][j-1], dp[i][j+1]) + 1
这个题要结果的问题是如何更新这个dp?遍历(逐个更新其元素)一个二维数组需要两成循环,横纵坐标能够表示两个遍历方向,我们需要四个,那么进行两次遍历更新,一个往左下,一个往右上【当然这里选择右下和左上的方向一样的】。代码如下:

class Solution {
    public int[][] updateMatrix(int[][] mat) {
        int rows = mat.length, cols = mat[0].length;
        int[][] distance = new int[rows][cols];
        for (int i = 0; i < rows; ++i) {
        	// 因为后续是求dp[i][j]的最小情况,先赋一个较大值
            Arrays.fill(distance[i], rows + cols + 1);
        }
		//如果mat[i][j] = 0,那么dp[i][j]自然也等于0
        for(int i = 0; i < rows; i++)
            for(int j = 0; j < cols; j++){
                if(mat[i][j] == 0)
                    distance[i][j] =0;
            }
        //往左下的方向更新dp
        for(int i = 0; i < rows; i++){
            for(int j = 0; j < cols; j++){
                if(i > 0)
                    distance[i][j] = Math.min(distance[i][j], distance[i-1][j] + 1);
                if(j > 0)
                    distance[i][j] = Math.min(distance[i][j], distance[i][j-1] + 1);
            }
        }
		//往右上的方向更新dp
        for(int i = rows - 1; i >= 0; i--){
            for(int j = cols - 1; j >= 0; j--){
                if(i < rows - 1)
                    distance[i][j] = Math.min(distance[i][j], distance[i+1][j] +1 );
                if(j < cols - 1)
                    distance[i][j] = Math.min(distance[i][j], distance[i][j+1] + 1);
            }
        }
        return distance;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用ssh服务器管理远程主机

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、配置网卡服务 1、配置网卡参数 2、创建网络会话 3、绑定两块网卡 二、远程控制服务 1、配置sshd服务 2、在Windows连接 3、安全密钥…

AI绘画:艺术与科技的交融,创新浪潮与无限可能

在科技日新月异的当下&#xff0c;AI 绘画作为人工智能领域的一颗璀璨新星&#xff0c;正以惊人的速度在国内崭露头角&#xff0c;引发了艺术与技术交融的全新变革。随着人工智能技术的飞速发展&#xff0c;AI绘画已成为艺术与科技交融的新宠。2024年&#xff0c;AI绘画行业在国…

【Python】已解决:SyntaxError: positional argument follows keyword argument

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;SyntaxError: positional argument follows keyword argument 一、分析问题背景 在Python编程中&#xff0c;当我们在调用函数时混合使用位置参数&#xff08;p…

【RAG KG】GraphRAG开源:查询聚焦摘要的图RAG方法

前言 传统的 RAG 方法在处理针对整个文本语料库的全局性问题时存在不足&#xff0c;例如查询&#xff1a;“数据中的前 5 个主题是什么&#xff1f;” 对于此类问题&#xff0c;是因为这类问题本质上是查询聚焦的摘要&#xff08;Query-Focused Summarization, QFS&#xff09…

tessy 单元测试:小白入门指导手册

目录 1,创建单元测试工程目录 2,导入单元测试源文件 一:创建测试文件夹(最好和代码目录一一对应,方便查找) 二:选择测试环境 三:添加源文件 四:分析源文件 3,编写单元测试用例 一:设置函数参数的传输方向 二:添加单元测试用例 三:编辑单元测试用例数据 …

网站更新改版了

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Leo杂谈 ✨特色专栏&#xff1a;MySQL学…

UI设计入门到精通:规范整理与应用技巧

很多刚入行的UI设计师在遇到一些不熟悉的词时会充满问号&#xff0c;往往会纠结用什么尺寸最合适。设计师在设计UI的时候不一定要严格遵守设计规范&#xff0c;但是要了解规范&#xff0c;整合&#xff0c;灵活处理。为了解决新手的“十万个为什么”&#xff0c;本文将带你了解…

无法连接Linux远程服务器的Mysql,解决办法

问题描述 如果是关闭虚拟机之后&#xff0c;二次打开无法连接Mysql&#xff0c;则可尝试一下方法进行解决 解决方法 关闭虚拟机的防火墙 1&#xff1a;查看防火墙状态 systemctl status firewalld 一下显示说明防火墙是启动的状态 2&#xff1a;关闭防火墙 systemctl st…

Python大数据分析——决策树和随机森林

Python大数据分析——决策树和随机森林 决策树决策树节点字段的选择信息熵条件熵信息增益信息增益率 基尼指数条件基尼指数基尼指数增益 决策树函数 随机森林函数 决策树 图中的决策树呈现自顶向下的生长过程&#xff0c;深色的椭圆表示树的根节点&#xff1b;浅色的椭圆表示树…

招投标信息采集系统:让您的企业始终站在行业前沿

一、为何招投标信息如此关键&#xff1f; 在经济全球化的大背景下&#xff0c;招投标活动日益频繁&#xff0c;成为企业获取项目、拓展市场的主流方式之一。招投标信息采集&#xff0c;作为企业战略决策的前置环节&#xff0c;其重要性不言而喻。它不仅关乎企业能否第一时间发…

探索 Qt 的 `QSqlDatabase`:数据库访问的桥梁

&#x1f60e; 作者介绍&#xff1a;欢迎来到我的主页&#x1f448;&#xff0c;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff08;领取大厂面经等资料&#xff09;&#xff0c;欢迎加我的…

C++|异常

目录 一、异常概念 二、异常使用 2.1异常的抛出与捕获 2.2异常的重新抛出 2.3异常安全注意事项 2.4异常规范 三、自定义异常体系 四、C标准库的异常体系 五、异常的优缺点 对于传统的错误处理机制&#xff0c;例如c语言常用的&#xff1a; 1.assert&#xff0c;捕获到…

【环境准备】 Vue环境搭建

文章目录 前言vue-cli 安装创建项目3.0、以下3.0 、以上 前言 书接上回《NodeJs(压缩包版本)安装与配置》&#xff0c;安装完了NodeJs&#xff0c;接下来就要配置vue的环境了。 vue-cli 安装 安装vue-cli输入如下命令 #&#xff08;安装的是最新版&#xff09; npm install …

windows的远程桌面连接docker

1. Docker容器中运行远程桌面服务 (RDP)&#xff1a;您的Docker容器需要安装和运行远程桌面服务。通常&#xff0c;远程桌面服务在Windows操作系统上可用。如果您使用的是Linux容器&#xff0c;则需要安装一个支持RDP协议的桌面环境和RDP服务器。 2. 开放RDP端口&#xff1a;通…

比赛获奖的武林秘籍:05 电子计算机类比赛国奖队伍技术如何分工和学习内容

比赛获奖的武林秘籍&#xff1a;05 电子计算机类比赛国奖队伍技术如何分工和学习内容 摘要 本文主要介绍了在电子计算机类比赛中技术层面上的团队分工和需要学习的内容&#xff0c;分为了嵌入式硬件、嵌入式软件、视觉图像处理、机械、上位机软件开发和数据分析等六个方向&am…

Mybatis Plus 3.X版本的insert填充自增id的IdType.ID_WORKER策略源码分析

总结/朱季谦 某天同事突然问我&#xff0c;你知道Mybatis Plus的insert方法&#xff0c;插入数据后自增id是如何自增的吗&#xff1f; 我愣了一下&#xff0c;脑海里只想到&#xff0c;当在POJO类的id设置一个自增策略后&#xff0c;例如TableId(value "id",type …

展开说说:Android服务之实现AIDL跨应用通信

前面几篇总结了Service的使用和源码执行流程&#xff0c;这里再简单分析一下如果需要Service跨进程通信该怎样做。AIDL&#xff08;Android Interface Definition Language&#xff09;Android接口定义语言&#xff0c;用于实现 Android 两个进程之间进行进程间通信&#xff08…

计算机网络之WPAN 和 WLAN

上一篇文章内容&#xff1a;无线局域网 1.WPAN&#xff08;无线个人区域网&#xff09; WPAN 是以个人为中心来使用的无线个人区域网&#xff0c;它实际上就是一个低功率、小范围、低速率和低价格的电缆替代技术。 &#xff08;1&#xff09; 蓝牙系统(Bluetooth) &#…

新闻资讯整合平台:一站式满足企业信息需求

摘要&#xff1a; 面对信息爆炸的时代&#xff0c;企业如何在海量数据中快速获取有价值资讯&#xff0c;成为提升竞争力的关键。本文将探讨如何通过一站式新闻资讯整合平台&#xff0c;实现企业信息需求的全面满足&#xff0c;提升决策效率&#xff0c;同时介绍实用工具推荐&a…

开源数据科学平台Anaconda简介

开源数据科学平台Anaconda简介 零、时光宝盒 最近&#xff0c;某金融行业女性选择以跳楼的形式结束自己的生命&#xff0c;这件不幸的事情成了热门话题&#xff0c;各种猜测的都有&#xff0c;有些人评论的话真的很过分。我想起前段时间看到的&#xff0c;有个女学生跳江&#…