【LeetCode】221. 最大正方形
解题思路
最大正方形问题需要在一个由 '0' 和 '1' 组成的二维矩阵中找到全为 '1' 的最大正方形面积。通过动态规划,我们可以高效解决:
- 核心思想:定义状态数组 
dp[i][j]表示以(i, j)为右下角的最大正方形边长。 - 状态转移:当 
matrix[i][j] = '1'时,其边长受限于左、上、左上三个相邻位置的最小值(木桶原理),即: 
![]()
- 边界处理:第一行或第一列的最大边长只能是 1(无法扩展)。
 - 空间优化:使用滚动数组将空间复杂度从 O(mn) 降至 O(n)。
 
关键步骤
- 
初始化检查:
- 若矩阵为空或首元素为 '0',直接返回 0。
 - 初始化一维数组 
dp(长度 = 列数+1),maxSide记录最大边长。 
 - 
动态规划遍历:
- 首行初始化:
dp[j] = 1(若matrix[0][j]=='1'),否则为 0。 - 后续行处理:
- 每行首列单独处理(只能从上方继承)。
 - 非首列位置:若 
matrix[i][j]=='1',则更新dp[j] = min(左、上、左上) + 1。 
 - 实时更新:
maxSide = max(maxSide, dp[j])。 
 - 首行初始化:
 - 
结果计算:
- 返回 
maxSide * maxSide(面积)。 
 - 返回 
 
代码实现
示例测试
复杂度分析
| 指标 | 值 | 说明 | 
|---|---|---|
| 时间复杂度 | O(mn) | 需遍历矩阵每个元素一次(m 行,n 列) | 
| 空间复杂度 | O(n) | 使用一维数组 dp(长度 = 列数),优化了二维数组的 O(mn) 空间  | 
关键点总结
- 
状态转移原理:
- 正方形的扩展受限于三个相邻方向(左、上、左上)的最小值。
 - 例如:若左、上、左上的边长均为 2,则当前位置可扩展为边长 3 的正方形。
 
 - 
边界处理:
- 首行/列无法扩展,直接取当前值(0 或 1)。
 - 空矩阵或首元素为 '0' 时立即返回 0,减少无效计算。
 
 - 
空间优化技巧:
- 滚动数组:通过 
prev变量保存左上角状态,避免二维数组开销。 - 索引偏移:
dp数组索引j+1简化边界检查。 
 - 滚动数组:通过 
 - 
失败场景处理:
- 遇到 '0' 时重置 
dp[j+1]=0(无法构成正方形)。 - 最大边长初始化为 0,避免全 0 矩阵误判。
 
 - 遇到 '0' 时重置 
 
                    
                
                
            
        
浙公网安备 33010602011771号