[LeetCode]221. Maximal Square 动态规划解法转移方程
作者:互联网
题目描述
LeetCode原题链接:221. Maximal Square
Given an m x n
binary matrix
filled with 0
's and 1
's, find the largest square containing only 1
's and return its area.
Example 1:
Input: matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]] Output: 4
Example 2:
Input: matrix = [["0","1"],["1","0"]] Output: 1
Example 3:
Input: matrix = [["0"]] Output: 0
Constraints:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j]
is'0'
or'1'
.
思路分析
这道题的Related Topic里有Dynamic Programming的标签,那我们就来看看动态规划思路的解法。
1)dp数组构造
我们遍历二维数组一般是按照从上到下、从左到右的顺序进行for循环。当到达一个新的位置(i,j)的时候,数组前 i 行和第 i+1 行前 j 列的位置都是已经遍历过了的。动态规划的核心就是用已知量去推导出未知量,所以(i,j)位置右面和下面的值是怎样无需关心,我们只要去关注上面和左面就可以了。那么,我们可以将当前访问的坐标当作某个可能存在的正方形的右下角,然后来看以该点为右下角的正方形可能的边长。由于只有1才可能组成正方形,当我们遇到0的时候,直接跳过就可以了。dp[m][n]表示一个与matrix矩阵相同大小的动态规划矩阵,dp[i][j]表示以(i,j)为正方形右下角时,存在的合法正方形中面积最大的那个正方形的边长。
当matrix[i][j]=0时,我们直接令dp[i][j]=0(以该位置为右下角的正方形不存在),当matrix[i][j]=1时,我们再进行后续计算。
2)寻找合法正方形
根据正方形的特性可知,可能存在的最大正方形的边长应该是 L = min(i, j)+1 ,我们可以把 L * L 区域当作一个搜寻范围。举个
标签:Maximal,Square,matrix,位置,合法,正方形,边长,LeetCode,dp 来源: https://www.cnblogs.com/barryyeee/p/15161551.html