1. All Top-Left Corners Expansion
Intuition
For every cell (i, j) with 1, test expanding squares of size 1, 2, 3... until a 0 is encountered.
Algorithm
- For each cell
(r, c)from0tom - 1and0ton - 1: - If
matrix[r][c] == '1': - Set
side = 1 - While expanding to
side + 1is within bounds and all new cells in row and col are1: -
side++ -
maxSide = max(maxSide, side) - Return
maxSide * maxSide.
#include <iostream>#include <vector>#include <algorithm> using namespace std; int maximalSquareBrute(vector<vector<char>>& matrix) { if (matrix.empty() || matrix[0].empty()) return 0; int m = matrix.size(), n = matrix[0].size(); int maxSide = 0; for (int r = 0; r < m; r++) { for (int c = 0; c < n; c++) { if (matrix[r][c] == '1') { int side = 1; bool flag = true; while (r + side < m && c + side < n && flag) { for (int k = r; k <= r + side; k++) { if (matrix[k][c + side] == '0') { flag = false; break; } } for (int k = c; k <= c + side; k++) { if (matrix[r + side][k] == '0') { flag = false; break; } } if (flag) side++; } maxSide = max(maxSide, side); } } } return maxSide * maxSide;} int main() { vector<vector<char>> matrix = { {'1','0','1','0','0'}, {'1','0','1','1','1'}, {'1','1','1','1','1'}, {'1','0','0','1','0'} }; cout << "Max Area (Brute Force): " << maximalSquareBrute(matrix) << endl; return 0;}Time & Space Complexity
- Time complexity:
O((m * n) * min(m, n)^2) - Space complexity:
O(1)