当前位置:网站首页>力扣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;
}
边栏推荐
- sklearn 笔记 TSNE
- 2021DASCTF实战精英夏令营暨DASCTF July X CBCTF 4th
- 社区分享|货拉拉通过JumpServer纳管大规模云上资产
- 【vulhub】MySql身份认证绕过漏洞复现(CVE-2012-2122)
- 第14届全国大学生信息安全竞赛-创新实践能力赛
- How to submit a PR?【OpenHarmony Growth Plan】【OpenHarmony Open Source Community】
- 地理探测器Geodetector软件的下载、应用与结果解读
- [Golang]用反射让你的代码变优美
- [SWPUCTF 2021 新生赛] web
- LeetCode-498-对角线遍历
猜你喜欢
随机推荐
INSERT:插入操作语法&使用例——《mysql 从入门到内卷再到入土》
卡片盒笔记法的操作步骤
2021DASCTF实战精英夏令营暨DASCTF July X CBCTF 4th
我的世界整合包 云服务器搭建方法(ECS)
第五届“强网杯”全国网络安全挑战赛(线上赛)
数据标注太昂贵?这个方法可以用有限的数据训练模型实现基于文本的ReID!
根心与根轴
[SWPUCTF 2021 新生赛] web
C. Social Distance
[Golang]从0到1写一个web服务(上)
labelme-屏蔽拖拽的事件
国内Gravatar头像的完美替代方案Cravatar
【Windows】你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问,这些策略可帮助保护你的电脑
饿了么-机构树单选
Auto.js中的悬浮窗
ACM解题笔记——HDU 1401 Solitaire(DBFS)
.NET现代应用的产品设计 - DDD实践
[mysql] 深入分析MySQL版本控制MVCC规则
Mark!画出漂亮的神经网络图!神经网络可视化工具集锦搜集
如何提高代码的可读性 学习笔记









