LeetCode如何实现最大正方形

这篇文章将为大家详细讲解有关LeetCode如何实现最大正方形,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1

 题目描述

0 和 1 组成一个字符型二维矩阵,在其中找到只包含 1 的最大正方形,并返回其面积。如:输入

[["1","0","1","0","0"],

["1","0","1","1","1"],

["1","1","1","1","1"],

["1","0","0","1","0"]]

返回4。

2

 题解

思路:动态规划
在LeetCode刷题DAY 2:最长回文子串中我们介绍了动态规划的含义,本次不再赘述,直接进入逻辑阐述。
  • 第一步,找到中间状态:此处中间状态st[i][j]表示以矩阵中(i,j)元素作为正方形右下角顶点,可以得到最大正方形边长。

  • 第二步,确定状态转移:如果(i,j)为0,则当前位置状态值为0,否则状态值取决于其上面、左面和左上角状态值,转移关系为st[i][j]=min(st[ist[i][j]=min(st[i-1][j],st[i-1][j-1],st[i][j-1])+1,即周围最小状态值+1。不理解的可以找个案例手动算一下。且要注意的是,如果该元素在整个矩阵的最外边,则状态值仅根据该元素取值判断即可。

class Solution:    def maximalSquare(self, matrix: List[List[str]]) -> int:        if len(matrix)==0:            return 0        # len(matrix)得到的是矩阵行数        st = [[0]*len(matrix[0]) for _ in range(len(matrix))]        maxlong = []        for i in range(len(matrix)):            for j in range(len(matrix[0])):                if matrix[i][j]=='1':                    if i*j==0:                        st[i][j]=1                    else:                        st[i][j]=min(st[i-1][j],st[i-1][j-1],st[i][j-1])+1            maxlong.append(max(st[i]))        return max(maxlong)**2

关于“LeetCode如何实现最大正方形”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。