题目
英文
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; } }
|