[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:

[LeetCode]221. Maximal Square 动态规划解法转移方程

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:

[LeetCode]221. Maximal Square 动态规划解法转移方程

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 区域当作一个搜寻范围。举个

上一篇:Nginx负载均衡策略


下一篇:221. Maximal Square