最大正方形(力扣)暴力 + 动态规划 JAVA

news2024/11/24 4:34:07

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

解题思路:

暴力破解:

1.注意题目中求的是最大正方形,不包括长方形

在这里插入图片描述
2.判断可能的最大正方形的边长

int mblen = Math.min(x - i, y - j);

3.判断正方形对角线是否为‘1’

for(int k = 1; k < mblen; k ++) {
                       
        			   if(matrix[i + k][j + k] == '0') { 
        				   check = false;
        				   break;//检查对角线
        			   }

4.若而对角线为‘1’判断正方形对角线两边是否都为‘1’

     			   for(int m = 0; m < k; m ++) {//检查正方形对角线两边是否都为1
        				  if(matrix[i + k][j + m] == '0' || matrix[i + m][j + k] == '0') { 
        					  check = false;
        					  break;
        				  }
        			   }

完整暴力破解代码:

class Solution {
    public int maximalSquare(char[][] matrix) {
           if(matrix.length == 0 || matrix[0].length == 0) return 0;
           int maxslen = 0;
           int x = matrix.length;
           int y = matrix[0].length;
           for(int i = 0; i < x; i ++)
        	   for(int j = 0; j < y; j ++) {
        		 if(matrix[i][j] == '1') {//在第一个为1的前提下才能检查后面的
                   maxslen = Math.max(1, maxslen);
        		   int mblen = Math.min(x - i, y - j);
        		   boolean check = true; 
        		   for(int k = 1; k < mblen; k ++) {
                       
        			   if(matrix[i + k][j + k] == '0') { 
        				   check = false;
        				   break;//检查对角线
        			   }
        			   
        			   for(int m = 0; m < k; m ++) {//检查正方形对角线两边是否都为1
        				  if(matrix[i + k][j + m] == '0' || matrix[i + m][j + k] == '0') { 
        					  check = false;
        					  break;
        				  }
        			   }
        			   
        			   if(check) maxslen = Math.max(maxslen, k + 1);//都为1更新//or check == true;
        			   else break;//否者没必要继续更新下去了
        		   }
        	   }
        	  }
           return maxslen * maxslen;
    }
}

在这里插入图片描述


动态规划:

1.设立dp[i][j] 即以(i, j)点为正方形右下角的最大边长

2.边界问题当 i=0 || j =0时dp[i][j] 最大为1

3.dp[i][j]由其左边、右边、左上角的最小值决定

4.
在这里插入图片描述
5.
在这里插入图片描述
6.

在这里插入图片描述

动态规划代码:

class Solution {
    public int maximalSquare(char[][] matrix) {
           int x = matrix.length;
           int y = matrix[0].length;
           if(x == 0 || y == 0) return 0;
           int dp[][] = new int[x][y];
           int maxlen = 0;
           for(int i = 0;i < x; i ++)
        	   for(int j = 0; j < y; j ++) {
        		   if(matrix[i][j] == '1') {
        			   if(i == 0 || j == 0) dp[i][j] = 1;
        			   else dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i - 1][j - 1], dp[i][j - 1])) + 1;
        		   }
        		   maxlen = Math.max(maxlen, dp[i][j]);
        	   }
           return maxlen * maxlen;
    }
}

在这里插入图片描述

动态规划优点在于用更多空间储存前面的计算的成果,使得在计算新的点时可以借助前面的成果迭代过来,类似于将四阶楼梯,分成一节一节去爬,前面一节会对后面一节产生辅助作用。

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

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

相关文章

陆航组训VR虚拟交互教学软件提高团队协作水平

出于陆航独特的空中环境&#xff0c;难以确保航空兵连队接受高质量的空中飞行训练&#xff0c;造成陆航连队无法保持良好的战备状态&#xff0c;随着VR虚拟现实技术越来越成熟&#xff0c;VR公司深圳华锐视点充分了解陆航训练教学的重点和难点&#xff0c;制作陆航训练VR教学课…

大模型技术发展概述 - (一)

文本内容参考论文《A Survey of Large Language Models》 论文标题&#xff1a;A Survey of Large Language Models 论文链接&#xff1a;https://arxiv.org/pdf/2303.18223v10.pdf 因为这个论文内容太多了&#xff0c;所以我的文章分成几篇来展示&#xff01;目录如下&#x…

每日一练 | 华为认证真题练习Day76

1、标准STP模式下&#xff0c;下列非根交换机中的哪个端口会转发由根交换机产生的TC置位BPDU&#xff1f; A. 根端口 B. 备份端口 C. 预备端口 D. 指定端口 2、STP协议中根桥发出的配置BPDU报文中的Message Age为0。 A. 对 B. 错 3、STP中选举根端口时需要考虑以下哪些参…

若依官方前端手册 小笔记

提供确认窗体信息 this.$modal.confirm(确认信息).then(function() {... }).then(() > {... }).catch(() > {}); 提供遮罩层信息 // 打开遮罩层 this.$modal.loading("正在导出数据&#xff0c;请稍后...");// 关闭遮罩层 this.$modal.closeLoading(); 验证…

Android 进程与进程之间的通讯 详解及实现步骤 -- 两个app实现

详情如下&#xff1a; 一、Intent二、Messenger三、AIDL四、广播五、文件 分两个app -- 客户端为&#xff1a;jinc1application、服务端为&#xff1a;jinc2application 一、Intent 这是 Android 中最常用的通讯方式&#xff0c;主要用于启动 Activity、Service 等 jinc1applic…

校园网免认证/校园网pojie

我们的目标是xiao yuan wang pojie 我们使用一个简单的python脚本&#xff0c;用于jiechu /pojie校园网只能登录一台手机和一台电脑的限制&#xff0c;仅供学习。 原理 我们利用已有可正常上网的校园网账户作为跳板&#xff0c;连上网后在后台下线账号所登录的设备&#xff0…

CNVnator软件的安装

1. 下载CNVvator CNVvator软件比较难安装&#xff0c;其依赖root软件等 下载地址 点击其release&#xff0c;下载最新版本v0.4.1(CNVnator_v0.4.1.zip) 2. 安装依赖 root 软件 root 的下载地址 root , 选择下列Ubuntu 20版本 解压root压缩包&#xff1a; ##解压 tar -zxv…

pdf转图片操作方法是什么?分享两个简单的方法!

PDF转图片是一个常见的需求&#xff0c;无论是为了方便编辑、共享&#xff0c;还是为了其他用途&#xff0c;我们需要简单而有效的方法来实现这个目标。本文将介绍两种简单的PDF转图片方法&#xff1a;记灵在线工具和截图方法。 记灵在线工具是一个强大而易于使用的在线工具&a…

如何结合云原生和低代码

前言 云原生和低代码是当今IT领域最流行的两个概念。云原生是一种应用架构设计、应用部署乃至应用开发过程的方式&#xff0c;而低代码是一种快速开发应用的方法。这两者有什么关系&#xff1f;如何结合呢&#xff1f; 先思考一个问题——一个杯子和一个苹果如何结合&#xf…

七牛云的使用(图片超详讲解)

一、为什么要使用七牛云的OSS(对象存储服务)&#xff1f; 二、七牛云使用&#xff1a; 登录七牛云官网&#xff0c;注册并认证 (初次认证有30天免费使用权限)新建存储空间 点击创建的空间名字&#xff0c;进入 空间概括如下&#xff1a; 阅读帮助文档&#xff0c;在自己的…

JavaCV实现byte[]转RTMP流

需求&#xff1a;通过私有的api我可以不断收到byte[]形式的视频数据&#xff0c;现在我需要处理这些数据&#xff0c;最终推送出RTMP流。 实现&#xff1a;通过管道流将不断收到的byte[]视频数据转化为输入流然后提供给JavaCV的FFmpegFrameGrabber使用&#xff0c;然后通过FFmp…

两种传输层协议TCP和UDP【图解TCP/IP(笔记十二)】

文章目录 两种传输层协议TCP和UDPTCP与UDP区分UDP的特点及其目的TCP的特点及其目的 两种传输层协议TCP和UDP 在TCP/IP中能够实现传输层功能的、具有代表性的协议是TCP和UDP。 ■ TCP TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构&#xff0c;你可以把它想象成排…

【C++】C++11 (2): 右值引用、移动构造、移动赋值和模板的可变参数

一、右值引用和移动语义 C11更新后&#xff0c;容器中增加的新方法有插入接口函数的右值引用版本 这些接口的意义在哪&#xff1f;网上都说它们能提高效率&#xff0c;它们是如何提高效率的&#xff1f; 请看下面的右值引用和移动语义的介绍。另外emplace还涉及模板的可变参…

开发跨平台APP,是用Flutter还是React Native开发框架?

随着移动互联网的飞速发展&#xff0c;对于开发人员而言&#xff0c;如何快速地开发出兼容不同平台&#xff08;iOS、Android&#xff09;的应用&#xff0c;成为了一个重要的问题。 跨平台应用程序开发框架的好处&#xff1a; 1. 一个App适用于多个设备&#xff1b; 2. 一个…

问一下路过的大神keil5与keil5mdk 的区别是什么?

从Keil C51都Keil5 MDK&#xff0c;不知不觉已经用了Keil十几年。 虽然现在新增了一些开发环境&#xff0c;不过keil对于老工程师来说&#xff0c;应该是最亲切的了… Keil出过很多个版本&#xff0c;很多人最熟悉的是Keil C51和Keil5 MDK。 我们在做STM32程序开发编译的时候…

Centos7安装SDWebui

Centos7安装SDWebui 1.nvidia显卡驱动安装 #查看显卡编号 lspci | grep -i vga#查询显卡型号 http://pci-ids.ucw.cz/mods/PC/10de?actionhelp?helppci#安装依赖包 yum install kernel-devel gcc -y #查看nouveau是否已禁用&#xff0c;如果有内容说明没有禁用 lsmod | gre…

记录一下2023.2kali的默认密码和修改root用户密码的方法

要水一篇博客了…… 默认登录用户名/密码&#xff1a; kali/kali 切换root用户&#xff1a; sudo su 这时输入的密码是kali 然后就切换到了root用户 输入passwd root 提示修改新密码 根据提示输入两遍新密码就修改了root用户的密码啦 &#xff08;感觉改不改的其实也……无所…

大华监控前端实时预览(踩坑)

难点在后端&#xff0c;前端主要是文档太少了&#xff0c;前端难点主要是接入摄像头&#xff0c;摄像头接入了&#xff0c;剩下什么对讲、调整方向、变焦之类的就简单了。 大华官网&#xff1a;https://open-icc.dahuatech.com/#/home 1.到官网下载插件或者demo&#xff0c;我是…

Xamarin.Android实现界面自动添加控件

目录 1、背景说明2、效果3、代码3.1、UI代码3.2、实现代码 4、代码下载5、相关知识点5.1、原理说明5.2、其他说明 6、参考资料 1、背景说明 有时需要在APP中动态的添加控件&#xff0c;因此记录下在Xamarin中的实现步骤。 VS2022社区版 2、效果 3、代码 3.1、UI代码 UI的代…

文件块读写

写文件&#xff1a; size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 功能&#xff1a;以数据块的方式给文件写入内容 参数&#xff1a; &#xff1a;准备写入文件数据的地址ptr &#xff1a; 为 类型&#xff0c;此参数指定写入文件内容的块数据大…