当前位置:网站首页>力扣221题,最大正方形
力扣221题,最大正方形
2022-08-10 20:59:00 【瀛台夜雪】
力扣221题,最大正方形
题目描述
在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。
输入输出样例

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:4

输入:matrix = [["0","1"],["1","0"]]
输出:1
输入:matrix = [["0"]]
输出:0
解法一:暴力解法
//使用暴力解法
//遍历矩阵中的每个元素每次遇到1,便将该元素作为正方形的左上角
//确定正方形的左上角,根据左上角所在的行和列计算可能的最大正方形的边长
//判断右下,右,下是否是元素均为1
//时间复杂度为O(mn*min(m,n)^2)
//空间复杂度 为 O(1)
int maximalSquare(vector<vector<char>>&matrix)
{
int rowLength=matrix.size();
int colLength=matrix[0].size();
if(rowLength==0||colLength==0)
{
return 0;
}
//存储当前值的最大边长
int maxSide=0;
//遍历空间中每一个为1的结点
for(int i=0;i<rowLength;i++)
{
for(int j=0;j<colLength;j++)
{
if(matrix[i][j]=='1')
{
maxSide=max(maxSide,1);
//计算当前可能存在的最大边长
int currMaxSide=min(rowLength-i,colLength-j);
//判断右下的值是否存在
for(int k=1;k<currMaxSide;k++)
{
//设置标志位,表明当前的右下,右侧,下侧是否均为1
bool flag=true;
if(matrix[i+k][j+k]=='0')
{
break;
}
//左下验证成功,则验证右侧和下侧是否为1
for(int m=0;m<k;m++)
{
if(matrix[i+k][j+m]=='0'||matrix[i+m][j+k]=='0')
{
flag=false;
break;
}
}
if(flag)
{
maxSide=max(maxSide,k+1);
}
else
{
break;
}
}
}
}
}
int maxSquare=maxSide*maxSide;
return maxSquare;
}
解法二:使用动态规划
//使用动态规划的方法
//动态规划,以右下角作为初值条件,且只包含1的正方形的边长的最大值
//状态转移方程 dp[i]由上方,左方,左上方的dp值决定
//dp[i][j]=min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])+1
//时复:O(mn)
//空复:O(mn)
int maximalSquare2(vector<vector<char>>&matrix)
{
int rowLength=matrix.size();
int colLength=matrix[0].size();
if(rowLength==0||colLength==0)
{
return 0;
}
//建立动态规划数组
vector<vector<int>>dp(rowLength,vector<int>(colLength,0));
//初始化动态规划数组和转移方程
int maxSides=0;
for(int row=0;row<rowLength;row++)
{
for(int col=0;col<colLength;col++)
{
if(matrix[row][col]=='1')
{
//对row和col的不同位置进行分类讨论
//因为在第一行,第一行无论如何dp的值肯定为1
if(row==0||col==0)
{
dp[row][col]=1;
}
else{
//转移方程
dp[row][col]=min(dp[row-1][col-1],min(dp[row-1][col],dp[row][col-1]))+1;
}
maxSides=max(maxSides,dp[row][col]);
}
}
}
return maxSides*maxSides;
}
边栏推荐
- 一次由groovy引起的fullGC问题排查
- ArcGIS自动随机生成采样点的方法
- shell小技巧(一百三十五)打包指定目录下所用文件,每个文件单独打包
- How to submit a PR?【OpenHarmony Growth Plan】【OpenHarmony Open Source Community】
- Auto.js中APP应用相关指令
- 图数据库(Neo4j)入门
- Bedtime story | made a Bitmap and AST length system configuration
- [mysql] 深入分析MySQL版本控制MVCC规则
- kuberentes Auditing 入门
- PostgreSQL — 安装及常用命令
猜你喜欢
随机推荐
sklearn 笔记 TSNE
SELECT:简单的查询操作语法&使用例——《mysql 从入门到内卷再到入土》
Auto.js中的悬浮窗
【网络通信四】ping工具源码cmake工程编译以及运行说明
APP application related instructions in Auto.js
用汇编带你看Golang里到底有没有值类型、引用类型
TCL:事务的特点,语法,测试例——《mysql 从入门到内卷再到入土》
数据标注太昂贵?这个方法可以用有限的数据训练模型实现基于文本的ReID!
Common functions of Auto.js to find pictures and colors
B. Trouble Sort
OPPO Enco X2 迎来秋季产品升级 旗舰体验全面拉满
实施MES管理系统前,这三个问题要考虑好
直播课堂系统08补-腾讯云对象存储和课程分类管理
PostgreSQL — 安装及常用命令
【Windows】你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问,这些策略可帮助保护你的电脑
ArcMap时间滑块功能动态显示图层数据并生成视频或动图
自建函数 测试例和语法——《mysql 从入门到内卷再到入土》
Floating window in Auto.js
svg+元素js实现在图片上描点成框,并获取相对图片的坐标位置
Getting started with kuberentes Auditing









