7 最大的以1为边界的正方形

news/2024/7/5 1:43:31

来源:LeetCode第1139题

难度:中等

描述:给你一个由若干0和1组成的二维网格grid,请你找出边界全部由1组成的最大正方形子网格,并返回该子网格中的元素个数,若不存在,则返回0;

思路:申请三个空间,第一个二维空间dp1[i][j],这个空间表示第i行第j列在[i][j]这个位置前面(左边)连续1的个数包括自己。第二个二维空间dp2[i][j],这个空间表示第i行第j列在[i][j]这个位置上面联系1的个数包括自己。第三个二维空间dp3[i][j]表示以[i][j]为右下角的最大正方形边长。

//首先定义一个函数,输入值时grid的二维数组,返回值是最大正方形元素的个数
public int maxSquare(int [][]grid)
{
//求grid矩阵的行数
int row=grid.length;
//求grid矩阵的列数,默认为长方形
int column=grid[0].length;
//生成3个动态数组
//第一个动态数组dp1[i][j]表示[i][j]位置处左边连续1的个数
int [][]dp1=new int[row][column];
//第二个动态数组dp2[i][j]表示[i][j]位置处上方连续1的个数
int [][]dp2=new int[row][column];
//第三个动态数组dp3[i][j]表示以[i][j]为右下角的最大正方形面积,围成的最大正方形边长*边长
int [][]dp3=new int[row][column];
//首先进行dp1[i][j]数组第一列的初始化,若第一个元素为1,则dp1[i][0]=1,否则dp1[i][0]=0;
for(int i=0;i<grid.length;i++)
{
if(grid[i][0]==1)
{
dp1[i][0]=1;
}else
{
dp1[i][0]=0;
}
}
//其次进行dp2[i][j]数组第一行的初始化,若第一个元素为1,则dp2[0][i]=1,否则dp2[0][i]=0;
for(int i=0;i<grid[0].length;i++)
{
if(grid[0][i]==1)
{
dp2[0][i]=1;
}else
{
dp2[0][i]=0;
}
}
//进行dp1[i][j]动态数组的递推公式,如果grid[i][j]==1,则dp1[i][j]=dp1[i][j-1]+1,否则为0
for(int i=0;i<grid.length;i++)
{
for(int j=1;j<grid[i].length;j++)
{
if(grid[i][j]==1)
{
dp1[i][j]=dp1[i][j-1]+1;
}else
{
dp1[i][j]=0;
}
}
}
//进行dp2[i][j]动态数组的递推公式,如果grid[i][j]==1,dp2[i][j]=dp[i-1][j]+1;,否则为0
for(int i=1;i<grid.length;i++)
{
for(int j=0;j<grid[i].length;j++)
{
if(grid[i][j]==1)
{
dp2[i][j]=dp[i-1][j]+1;
}else
{
dp2[i][j]=0;
}
}
}
//进行dp3[i][j]动态数组第一列的初始化,若对应位置为1,则dp3[i][0]=1;
for(int i=0;i<grid.length;i++)
{
if(grid[i][0]==1)
{
dp3[i][0]=1;
}else
{
dp3[i][0]=0;
}
}
//进行dp3[i][j]动态数组第一行的初始化,若对应位置为1,则dp3[0][i]=1;
for(int i=1;i<grid[0].length;i++)
{
if(grid[0][i]==1)
{
dp3[0][i]=1;
}else
{
dp3[0][i]=0;
}
}
//定义变量maxsize表示从[i][j]位置上下寻找到的最大正方形边长
int maxside=0;
//记录最大的正方形边长,并最后返回
int maxsquqre=0;
for(int i=1;i<grid.length;i++)
{
for(int j=1;j<grid[i].length;i++)
{
//如果grid[i][j]==0,则以[i][j]无法构成正方形,dp3[i][j]=0;
if(grid[i][j]==0)
{
dp3[i][j]=0;
}else
{
//从[i][j]位置左边和上边寻找最小连续1的个数,从而可以构成最大边长
maxside=Math.min(dp1[i][j],dp2[i][j]);
for(int i=maxside;i>=0;i--)
{
//不断由最大变成找到最左边的位置[i][j-maxsize+1]并且求解该位置竖向上方1的个数dp2[i][j-maxsize+1],找到最上边的位置[i-maxsize+1][j]并且求解该位置左边连续1的个数,如果均大于maxsize,表示能构成正方形,否则继续缩小maxsize,不断进行寻找,一旦找到满足条件的,记录入dp3中,并与maxsquare进行对比后break跳出循环
if(dp2[i][j-maxsize+1]>=maxsize&&dp1[i-maxsize+1][j]>=maxsize)
{
dp3[i][j]=i*i;
maxsquare=Math.max(maxsquare,dp3[i][j]);
break;
}
}
}
}
}
return maxsqure;
}


http://lihuaxi.xjx100.cn/news/1840453.html

相关文章

vue2使用ts vue-class-component

目前&#xff0c;对于Vue3来说&#xff0c;TypeScript的支持已经相当成熟&#xff0c;但公司的老项目一直处于迭代和维护无法从v2重构成v3&#xff0c;并且重构的成本也是很大的一个问题&#xff0c;所以记录一下vue2如何去搭配TypeScript。 目录 一、脚手架创建项目 二、vu…

Java - Stream Filter 多条件筛选过滤

Java Stream流中Filter用于通过设置的条件过滤出元素 &#xff0c;示例如下&#xff1a; List strings Arrays.asList(“abc”, “”, “bc”, “efg”, “abcd”,"", “jkl”);List filtered strings.stream().filter(string -> !string.isEmpty()).collect(C…

关于fine-tune “微调”

大模型的 Fine-tune 我们对技术的理解&#xff0c;要比技术本身更加重要。 正如我在《大模型时代的应用创新范式》一文中所说&#xff0c;大模型会成为AI时代的一项基础设施。 作为像水、电一样的基础设施&#xff0c;预训练大模型这样的艰巨任务&#xff0c;只会有少数技术…

HCIA-H12-811题目解析(2)

1、【单选题】 在以太网这种多点访问网络上PPPOE服务器可以通过一个以太网端口与很多PPPOE客户端建立起PPP连接&#xff0c;因此服务器必须为每个PPP会话建立唯一的会话标识符以区分不同的连接PPPOE会使用什么参数建立会话标识符? 2、【单选题】PPP协议定义的是OSI参考模型中…

国标GB28181安防视频平台EasyGBS现场突发播放中断是什么原因?

视频流媒体安防监控国标GB28181平台EasyGBS视频能力丰富&#xff0c;部署灵活&#xff0c;既能作为业务平台使用&#xff0c;也能作为安防监控视频能力层被业务管理平台调用。国标GB28181视频EasyGBS平台可提供流媒体接入、处理、转发等服务&#xff0c;支持内网、公网的安防视…

CountDownLatch和CyclicBarrier源码详解

其他系列文章导航 Java基础合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章目录文章目录前言 前言 我现在有个场景:现在我有50个任务&#xff0c;这50个任务在完成之后&#xff0c;才能执行下一个函数&#xff0c;要是你&#xff0c;你怎么设计? 可…

计算机组成原理-虚拟存储器

文章目录 虚拟存储系统页式虚拟存储器存储器的层次化结构段式虚拟存储器段页式虚拟存储器 虚拟存储系统 将辅存中程序部分调入内存&#xff0c;程序其他待分待需要再调入内存 页式虚拟存储器 将辅存中的程序分页&#xff0c;将当前用得到的程序的页调入到主存中。 外存块号…

Django整合回顾

web应用 什么是web&#xff1a;通过web访问web应用程序&#xff0c;很方便&#xff0c;用户只需要一个浏览器即可。是典型的浏览器/服务器端架构的产物 cs架构与bs架构 应用程序有C/S B/S两种模式&#xff1a;b/s 本质上还是c/s mysql属于c/s架构&#xff0c;只是我们的服务…