[抄题]:
在一个二维01矩阵中找到全为1的最大正方形
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
返回 4
[暴力解法]:
时间分析:
空间分析:i j 中保留一排,用指针数组来优化空间存储
[思维问题]:
[一句话思路]:
棋盘类dp也是用扩展,不过是从右下角开始扩展 最大扩展中的最小值,没见过
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- 第0列初始化完成时,j 从1 开始。
第一次发现初始化会对后续计算结果产生影响
- 某点的最大扩展f是收到其右下角三个点的计算得出的最大扩展f共同制约的,要看图理解
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
i or j中的一个只有2种状态,所以可以mod2
[复杂度]:Time complexity: O(n) Space complexity: O(1)
[英文数据结构或算法,为什么不用别的数据结构或算法]:
格子类dp 属于坐标型
[关键模板化代码]:
f[i % 2][0] = matrix[i][0];
只有状态数组f要mod2
[其他解法]:
[Follow Up]:
空间优化
[LC给出的题目变变变]:
85. Maximal Rectangle 还是dp但是图形分析更复杂
[代码风格] :
public int maximalSquare(char[][] matrix) {
//state
//corner case
int n = matrix.length;
int m = matrix[0].length;
int[][] f = new int[2][m];
int ans = 0;
if (n == 0) {
return 0;
} //initialize for i = 0, j >= 1
for (int i = 0; i < n; i++) {
if (matrix[i][0] == '1')
{f[i % 2][0] = 1;
ans = Math.max(f[i % 2][0], ans);}
for (int j = 1; j < m; j++) {
//if row is not 0
if (i > 0) {
//if matrix[i][j] exists
if (matrix[i][j] == '1') {
//+1
f[i % 2][j] = 1 + Math.min(f[(i - 1) % 2][j],Math.min(f[i % 2][j - 1], f[(i - 1) % 2][j - 1]));
}
else {
f[i % 2][j] = 0;
}
}else {
//if row is 0
if (matrix[i][0] == '1')
f[i % 2][j] = 1;
}
ans = Math.max(f[i % 2][j], ans);
}
}
//result
return ans * ans;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)