Max Square

Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.

Example

For example, given the following matrix:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

Return4.

Note

长方形往往选左上和右下角的角点开始, 正方形一般选右下角.

(2,3)这个点为右下角点的square的大小, 其实和(1,2)有关, 它最大是(1,2)的squre的边长再加一 那么呢, 我们可以把正方形分成pic5.1图中的几个部分: Evernote Snapshot 20171031 162349 对于一个点A, 我们需要看看它左上的点最大的正方形边长, 然后验证它左边连续是1的点的长度和上面连续是1的点的长度, 即

1. for向左都是1的长度
2. for向上都是1的长度
3. for左上点的最大正方形的边长

1, 2和3的值中的最小值+1就是结果

其中1和2可以用预处理过得矩阵left[][]和up[][]优化. 这是状态方程是:

接着呢, 我们发现, 其实left和up矩阵是不需要的. 如图pic5.2: Evernote Snapshot 20171031 164120

我们发现, A为右下角点的铅笔画大正方形A全为1需要的条件是:

加上

所以我们只需要在左点, 上点和左上点各自最大正方形的边长取最小值, 再加1就行了. 状态方程变成

Code

滚动数组优化

需要多少个状态, 就存多少个.

求第i个状态, 如果只与i-1有关, 那就只需要两个数组. 用previous数组, 推now数组. 所以上一个解法中, j可以都模2.

那i为什么不能模呢? 因为如果i模了的话, 下一行左边开始的时候, 存的还是上一行最右边末尾的值, 不行哒~ 状态方程变为:

其中要注意初始化和答案也要记得模:

初始化 Intialization:

答案 Answer

Last updated