Skip to content

Latest commit

 

History

History
77 lines (56 loc) · 2.85 KB

221.md

File metadata and controls

77 lines (56 loc) · 2.85 KB

✏️Leetcode之PHP版题目解析(221. Maximal Square)

2020-03-22 吴亲库里 库里的深夜食堂


✏️描述

在给定只包含 0 和 1 的二维矩阵中,找出只包含 1 的最大正方形面积。所以图中 demo 的值是4。


✏️题目实例

****

✏️题目分析

暴力法是可以解的,但是这辈子都不可能用暴力法的。ps:我在骗人。

之前也有专门的文章提到过动态规划 算法之动态规划。(这篇文章写于大半年以前,发现现在对动态规划又有了一点新认识)。类似最大,最小......,这种极限值一般情况下都是可以使用动态规划来解的,为什么呢?道理其实很简单,因为最大值依赖于递进的结果。这句话咋么理解?还是举上面的例子,最终的结果是4。它是一开始就直接能得出4吗?不是!在坐标(0,0)的位置,最大正方形边长是1,面积也是1。到了(2,3)的位置,最大边长为2,面积为4,之后就不存在更大的边长了。

这个过程中,需要根据之前位置的状态以及当前位置的值,更新当前状态值。并且始终存在一个全局最大边长(方便直接平方,返回结果)。

我们需要更新全局最大边长值。这个值是根据什么更新的?也就是和谁去比较?当然是和当前下标位置的最大边长(状态的定义)进行比较,当前下标边长如何算出的?(状态转移方程),下图反映了这个过程:

动态规划先定义状态

dp[$i][$j] //表示下标为(i,j)时最大正方形边长

状态转移方程

dp[$i][$j]=min($dp[$i-1][$j,$dp[$i][$j-1],$dp[$i-1][$j-1])+1

✏️代码实现

class Solution {

    /**
     * @param String[][] $matrix
     * @return Integer
     */
    function maximalSquare($matrix) {
        $row=count($matrix);
        $cols=$row>0?count($matrix[0]):0;
        $max=0;
        $dp=[];
        for($i=1;$i<=$row;$i++){
            for($j=1;$j<=$cols;$j++){
                if($matrix[$i-1][$j-1]==1){
                    $dp[$i][$j]=min($dp[$i-1][$j],$dp[$i][$j-1],$dp[$i-1][$j-1])+1;
                    $max=max($max,$dp[$i][$j]);
                }
            }
        }
        return $max*$max;
    }
}

联系