https://leetcode-cn.com/explore/interview/card/bytedance/246/dynamic-programming-or-greedy/1028/
动态规划的思路
其实所有动态规划的思路,都是要找规律。这个题只要找到了规律,就很简单。
对于每个节点 a[i][j],加入他为1,那么他能组成的最大正方形的边长,取决于他周边的几个节点a[i-1][j],a[i][j-1],a[i-1][j-1],如果这三个都能组成边长为2的正方形,那么加上他,就变成了边长为3的正方形。但是这三个有1个不能组成,那么加上这个节点也无法组成。
所以 a[i][j] = min(a[i-1][j],a[i][j-1],a[i-1][j-1]) + 1
然后正方形的面积就是周长的平方。
代码如下:
class Solution(object):
def maximalSquare(self, matrix):
"""
:type matrix: List[List[str]]
:rtype: int
"""
if not matrix:
return 0
pos = []
for i in range(0,len(matrix)):
pos.append([0]*len(matrix[i]))
# 对第一行赋值:
result = 0
for i in range(0,len(matrix[0])):
if matrix[0][i]=='1':
pos[0][i] = 1
result = 1
# 对第一列赋值
for i in range(0,len(matrix)):
if matrix[i][0] == '1':
pos[i][0] = 1
result = 1
for i in range(1,len(matrix)):
for j in range(1,len(matrix[0])):
if matrix[i][j] == '1':
pos[i][j] = min(pos[i-1][j],pos[i][j-1],pos[i-1][j-1]) + 1
result = max(result,pos[i][j]*pos[i][j])
return result
网友评论