vlambda博客
学习文章列表

动态规划解决最大正方形问题

在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

示例:

输入:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

输出: 4

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximal-square 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

同样,这种问题,也是由动态规划解决,题目中要求我们求解最大的正方形,那么,很显然可以想到,每一个正方形,都是由更小的正方形组成的。

但是本题还不能这么解,因为大的正方形,如果求出所有小的正方形,也是复杂度相当高的过程。

我们可以换个思路,

  1. 针对某一个点A,坐标为 (i,j),假设此点为我们要求的正方形的右下角的点,那么,我们只需要计算出这个点的最大边长,即可得出最大面积;

  2. 如何计算出最大边长呢,我们需要考虑一个问题,假如A点为我们最终需要的点,那么,显然以下三个点,也必须是1,分别为 (i-1, j), (i, j-1), (i-1,j-1),即A点的左/上/左上,三点

  3. 同时还要明确A点的最边长,不可能超过上述三点位置的最小值加一,此条可能不太容易理解。假如(i-1,j)=2,(i-1,j-1)=4,那么,对于点A,横向的宽度,最多也就(2+1)

  4. 所以我们只需要取,三个点的最小值再加一,即可得到当前点的最大边长。

具体实现,见代码,整体思路清楚之后,实现起来就是很easy的事了


后记

大佬们动动手指赏个star https://github.com/severalfly/leetcode-leon