最大正方形

2019-07-22  本文已影响0人  hustyanye

https://leetcode-cn.com/explore/interview/card/bytedance/246/dynamic-programming-or-greedy/1028/

image.png

动态规划的思路
其实所有动态规划的思路,都是要找规律。这个题只要找到了规律,就很简单。
对于每个节点 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
上一篇下一篇

猜你喜欢

热点阅读