Maximal Square

Largest all-1 square in a binary matrix — DP where dp[r][c] = 1 + min(left, top, top-left).

Medium
Time O(m * n) Space O(n)
LeetCode
4 min read
dp grid

Problem#

Largest all-1 square in a binary matrix. Return its area.

Examples#

  • [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]4

Constraints#

  • 1 <= m, n <= 300.

Approach#

dp[r][c] = side length of the largest all-1 square ending at (r, c). Recurrence: dp[r][c] = 1 + min(dp[r-1][c], dp[r][c-1], dp[r-1][c-1]) if grid[r][c] == '1'. Roll to 1D.

Solution#

Maximal Square
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
vector<int> dp(n + 1, 0);
int best = 0, prev = 0;
for (int r = 0; r < m; ++r) {
for (int c = 1; c <= n; ++c) {
int temp = dp[c];
if (matrix[r][c - 1] == '1') {
dp[c] = 1 + min({dp[c], dp[c - 1], prev});
best = max(best, dp[c]);
} else {
dp[c] = 0;
}
prev = temp;
}
}
return best * best;
}
};

Editorial#

The recurrence’s min captures that all three neighboring squares (left, top, top-left) must already be at least the current side length minus 1. Rolling 1D needs prev to remember the diagonal predecessor.

Complexity#

  • Time: O(m * n).
  • Space: O(n).

Concept revision#

Search ESC

Keyboard shortcuts

Shortcuts are disabled while typing in inputs.