正方形题库
最大正方形
在一个由 '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
方案 动态规划
思路:
- 状态定义:
dp[i][j]
表示以(i,j)
为右下角,且只包含1
的正方形的边长最大值 - 状态转移方程:
- 如果该位置的值是0,则方程为
dp[i][j]=0
- 如果
i=0||j=0
,则方程为dp[i][j]=1
- 如果该位置的值是1,则
dp[i][j]
的值由上方、左方和左上方的三个相邻位置的dp
值决定,具体而言,当前位置的元素值等于三个相邻位置的元素中的最小值加1,则方程为:dp[i][j]=min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])+1
- 初始化状态: dp 初始为 0
- 问题答案: dp 元素中的最大值
:::details 点击查看代码
function maximalSquare(matrix) {
let maxSide=0;
const row=matrix.length;
const col=matrix[0].length;
if(!matrix||row==0||col==0){
return maxSide;
}
const dp=new Array(row).fill(0).map(()=>new Array(col).fill(0));
for(let i=0;i<row;i++){
for(let j=0;j<col;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],dp[i-1][j-1],dp[i][j-1]])+1;
}
}
maxSide=Math.max(maxSide,dp[i][j]);
}
}
let maxSquare=maxSide*maxSide;
return maxSquare;
};
:::
性能分析:
- 时间复杂度: O(mn)
- 空间复杂度: O(mn)