美文网首页
最大正方形

最大正方形

作者: hustyanye | 来源:发表于2019-07-22 20:03 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:最大正方形

          本文链接:https://www.haomeiwen.com/subject/anrglctx.html