题目
英文
Given a 2D binary matrix filled with 0’s and 1’s, find the largest square containing only 1’s and return its area.
Example:
Input: 
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Output: 4
中文
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
思路
- 动态规划(主要用户将一个复杂的问题分解为多个建单的问题,求最优解时)。
- 声明一个空间和原有二位数据大小一样的二位数组(tmp[i][j])。
- 计算每一个节点最大正方形的边长,并存储与该节点(利用之前节点计算当前节点最大正方形边长)。
- 取tmp[i][j]得最大值的平凡返回。代码
第一版代码
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
 | class Solution {   function maximalSquare($matrix) {       $hight =  count($matrix);       if($hight<1)       {           return 0;       }       $wide = 0;       if($hight > 0){           $wide= count($matrix[0]);       }       $ret = 0;       for($i = 1; $i<= $hight; $i++)       {           $tmp = $this->getRet($matrix, $i, $hight, $wide);           if($ret <$tmp ){               $ret = $tmp;           }       }       return $ret;   }        public function getRet($matrix, $i, $hight, $wide)   {          for($h = 0; $h<= $hight-$i; $h++ )     {            for($j = 0;$j <= $wide-$i; $j++)         {                          $ret = 1;             for($m = $h; $m <$h + $i; $m++){                 for($k = $j; $k < $j + $i; $k++){                     if($matrix[$m][$k] == 0)                     {                         $ret = 0;                         break;                     }                 }                 if($ret == 0) {                     break;                 }             }             if($ret == 1){                 return $i*$i;             }         }     }     return 0;   }      }
 | 
用php跑测试用例,跑了2.5秒。😓
回头用c重写下试试。
最优解
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 | class Solution {     public int maximalSquare(char[][] matrix) {                  dp[i][j]表示以第i行第j列为右下角所能构成的最大正方形边长, 则递推式为:          dp[i][j] = 1 + min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]);         **/         int m = matrix.length;         if(m < 1) return 0;         int n = matrix[0].length;         int max = 0;         int[][] dp = new int[m+1][n+1];                  for(int i = 1; i <= m; ++i) {             for(int j = 1; j <= n; ++j) {                 if(matrix[i-1][j-1] == '1') {                     dp[i][j] = 1 + Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1]));                     max = Math.max(max, dp[i][j]);                  }             }         }                  return max*max;     } }
 |