一、题目描述:
在一个由0和1组成的二维矩阵内,找到只包含1的最大正方形,并返回其面积。
实例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
二、代码实现:
func maximalSquare(matrix [][]byte) int{
maxside:=0
//判断是否为空矩阵
if len(matrix)==0||len(matrix[0])==0{
return maxside
}
//计算矩阵的行数和列数
rows:=len(matrix)
col:=len(matrix[0])
//遍历矩阵,寻找最大的正方形
for i:=0;i<rows;i++{
for j:=0;j<col;j++{
if matrix[i][j]=='1'{
//遇到一个‘1’作为左上角
matrix=max(matrix,1)
//可能出现的最大的正方形(不能超过矩阵行数和列数)
curMaxside:=min(rows-i,col-j)
//从遇到‘1’的行数和列数开始同时加k
for k:=0;k<curMaxside;k++{
//判断新增的行和列是否均为1
flag:=true
if matrix[i+k][j+k]=='0'{
break
}
//判断正方形中的边是否存在‘0’
for 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
}
}
}
}
}
return maxside*maxside
}
func max(x,y int) int{
if x>y{
return x
}
return y
}
func min(x,y int) int{
if x<y{
return x
}
return y
}
三、解题思路:
- 暴力解决法
我们都知道,正方形的面积=边长*边长,即边长的平方。那要计算正方形的面积,就要找到最大正方形的边长,然后计算最大边长的平方即可。
暴力解决法是最简单直观的方法,具体步骤如下:- 遍历矩阵中的每个元素,遇到‘1’,则将该元素作为左上角;
- 确定正方形的左上角后,根据这个元素的行和列计算可能的最大正方形的边长(不超过矩阵的行数和列数)
- 每次在下方新增一行以及向右新增一列,判断新增的行和列是否满足所有元素都是1。
- 复杂度分析
- 时间复杂度:O(mn*min(m,n) ^2),其中m和n是矩阵的行数和列数。
- 需要遍历整个矩阵来寻找1,遍历矩阵的时间复杂度为O(mn).
- 对于每个可能的正方形,其边长不超过m和n中最小值,需要遍历该正方形中的每个元素判断是不是含有0,遍历正方形时间复杂度为O(min(m,n)^2)
- 总的时间复杂度:O(mn*min(m,n) ^2)
- 空间复杂度:O(1).额外使用的空间复杂度为常数。
- 时间复杂度:O(mn*min(m,n) ^2),其中m和n是矩阵的行数和列数。