https://leetcode.com/problems/maximal-square/
221. Maximal Square
- Total Accepted: 44584
- Total Submissions: 169331
- Difficulty: Medium
- Contributors: Admin
Given a 2D binary matrix filled with 0’s and 1’s, find the largest square containing only 1’s and return its area.
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
Return 4.
Code
class Solution(object):
def maximalSquare(self, matrix):
"""
:type matrix: List[List[str]]
:rtype: int
"""
if not matrix:
return 0
# convert to integer matrix
for i in xrange(len(matrix)):
for j in xrange(len(matrix[0])):
matrix[i][j] = int(matrix[i][j])
max_size = max(matrix[0])
# DP storage initialized with the first row of matrix
vec = list(matrix[0])
for row in xrange(1, len(matrix)):
topleft = vec[0]
vec[0] = matrix[row][0]
for col in xrange(1, len(matrix[0])):
if matrix[row][col] == 0:
new = 0
else:
new = min(topleft, vec[col-1], vec[col]) + 1
topleft = vec[col]
vec[col] = new
max_size = max(max_size, max(vec))
return max_size * max_size
Idea
Think about it as a 2D DP problem. Suppose a list vec has size num_row * num_col. vec[i][j] is the size of the maximum square that can be achieved at matrix[i][j]. The core logic is that vec[i][j] = min(vec[i][j-1], vec[i-1][j],vec[i-1][j-1]).
And we know that 2D DP problem can often be reduced to 1D. That’s how I implement currently.
Reference: