题目链接
英文链接:https://leetcode.com/problems/maximal-square/
中文链接:https://leetcode-cn.com/problems/maximal-square/
题目详述
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
1 | 输入: |
题目详解
动态规划。
dp[i][j]
表示右下角处于位置(i, j)
处的最大正方形的边长。- 如果
matrix[i][j] == 0
,那么dp[i][j] = 0
。 - 如果
matrix[i][j] == 1
,那么dp[i][j] = 1 + min{dp[i - 1][j - 1], dp[i][j - 1], dp[i - 1][j]}
。 - 维护一个变量
res
,记录每个位置最大正方形的边长,那么最大面积为res * res
。
1 | public class LeetCode_00221 { |
我们可以把上面的 dp 数组在一维和二维上都多开一点空间,统一初始状态的初始化,代码可以写得更简洁。
1 | public class LeetCode_00221 { |
- 因为
dp[i][j]
只与dp[i - 1][j - 1]
、dp[i][j - 1]
、dp[i - 1][j]
这三个状态有关,在数组第一维,当前层只与当前层与上一层的状态的有关,可以将数组第一维大小压缩为 2。 - 再进一步,我们可以将第一维的大小由 2 压缩置 1。
- 最终的结果是将二维数组压缩成一维数组,降低空间复杂度。
1 | public class LeetCode_00221 { |