436 字
2 分钟
最大正方形

题目描述#

在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。

解题思路#

  1. 动态规划定义: dp[i][j] 表示以 (i,j) 为右下角的最大正方形边长。
  2. 状态转移方程: 若 matrix[i][j]=='1',则 dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1;否则为 0
  3. 初始化: 首行和首列直接复制 matrix 值(转换为数字)。
  4. 更新结果: 遍历过程记录最大边长,结果 = 最大边长²。

关键洞察#

  1. 右下角核心: 以 (i,j) 为右下角的正方形边长,由左上、上、左三个相邻点的最小值决定(短板效应)。
  2. 几何约束: 状态转移方程保证区域内全为 ‘1’(取最小值扩展时不会覆盖 ‘0’)。
  3. 空间优化: dp 数组可降维至 O(n)(仅需保存上一行和当前行前一列)。

复杂度分析#

  • 时间复杂度O(m×n) 遍历矩阵每个元素一次。
  • 空间复杂度
    • 基础版:O(m×n)(二维 dp 数组)
    • 优化版:O(n)(一维数组,n 为列数)

代码实现#

/**
* @param {character[][]} matrix
* @return {number}
*/
var maximalSquare = function (matrix) {
if (!matrix || matrix.length === 0 || matrix[0].length === 0) return 0
const m = matrix.length, n = matrix[0].length
let maxSide = 0
const dp = new Array(n + 1).fill(0)
let prev = 0
for (let i = 1; i <= m; i++) {
for (let j = 1; j <= n; j++) {
let temp = dp[j]
if (matrix[i - 1][j - 1] === '1') {
dp[j] = Math.min(dp[j], dp[j - 1], prev) + 1
maxSide = Math.max(maxSide, dp[j])
} else {
dp[j] = 0
}
prev = temp
}
prev = 0
}
return maxSide * maxSide
}

相似题目#

最大正方形
https://website-truelovings-projects.vercel.app/posts/algorithms/最大正方形/
作者
欢迎来到StarSky的网站!
发布于
2025-08-06
许可协议
CC BY-NC-SA 4.0