Algorithms first
最大正方形 · 交互式算法学习
返回只含 1 的最大正方形面积。
#221 · 多维动态规划
最大正方形
Maximal Square
matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]矩阵3 个关键状态
步骤 1第一行每个 1 的边长为 1。
dp row110,0
00,1
10,2
00,3
00,4
11,0
01,1
11,2
11,3
11,4
12,0
12,1
12,2
12,3
12,4
13,0
03,1
03,2
13,3
03,4
推荐
最大边长 DP
时间
O(mn)空间 O(n)若当前格为 1,最大边长是左、上、左上最小值加一。
1function maximalSquare(a) {2 const dp = Array(a[0].length + 1).fill(0);3 let best = 0,4 prev = 0;5 for (let r = 1; r <= a.length; r++) {6 for (let c = 1; c <= a[0].length; c++) {7 const old = dp[c];8 if (a[r - 1][c - 1] === '1') {9 dp[c] = 1 + Math.min(dp[c], dp[c - 1], prev);10 best = Math.max(best, dp[c])11 } else dp[c] = 0;12 prev = old13 }14 prev = 015 }16 return best * best;17}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1class Solution {2 public int maximalSquare(char[][] matrix) {3 int m = matrix.length, n = matrix[0].length;4 int[][] dp = new int[m + 1][n + 1];5 int mx = 0;6 for (int i = 0; i < m; ++i) {7 for (int j = 0; j < n; ++j) {8 if (matrix[i][j] == '1') {9 dp[i + 1][j + 1] = Math.min(Math.min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1;10 mx = Math.max(mx, dp[i + 1][j + 1]);11 }12 }13 }14 return mx * mx;15 }16}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。
AlgoViz Lab
最大正方形 · 解法对比
返回只含 1 的最大正方形面积。
- 测试用例
matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]- 题目分类
- 多维动态规划
- 解法对比
- 2
枚举左上角和边长
每个 1 作为左上角,逐边长检查区域是否全 1。
- 时间
O(mn·min(m,n)²)- 空间
O(1)
最大边长 DP
若当前格为 1,最大边长是左、上、左上最小值加一。
- 时间
O(mn)- 空间
O(n)