LeetCode Maximal Square
2015-07-09 21:33
288 查看
Description:
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.
For example, given the following matrix:
Solution:
方法一:就一个个来咯,从小到大找,len从小到大,如果有len不存在,就返回最大值。
方法二:也可以用DP来解决,dp[i][j]记录的是从i,j这个点开始,能走的最大的正方形的边长。所以如果dp[i][j],dp[i+1][j],dp[i][j+1]和dp[i+1][j+1]都等于l,则dp[i][j]=l+1
方法三:倒溯法,从最右下角来,如果dp[i][j] = min{dp[i+1][j], dp[i][j+1], dp[i+1][j+1] } +1
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.
For example, given the following matrix:
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0
Solution:
方法一:就一个个来咯,从小到大找,len从小到大,如果有len不存在,就返回最大值。
import java.util.*; public class Solution { public int maximalSquare(char[][] matrix) { int m = matrix.length; if (m == 0) return 0; int n = matrix[0].length; int len = Math.min(m, n); loop: for (int l = 1; l <= len; l++) { for (int i = 0; i <= m - l; i++) { for (int j = 0; j <= n - l; j++) { if (matrix[i][j] == '1' && valid(matrix, i, j, l)) continue loop; } } return (l - 1) * (l - 1); } return len * len; } boolean valid(char[][] matrix, int a, int b, int len) { for (int i = a; i < a + len; i++) for (int j = b; j < b + len; j++) if (matrix[i][j] != '1') return false; return true; } }
方法二:也可以用DP来解决,dp[i][j]记录的是从i,j这个点开始,能走的最大的正方形的边长。所以如果dp[i][j],dp[i+1][j],dp[i][j+1]和dp[i+1][j+1]都等于l,则dp[i][j]=l+1
import java.util.*; public class Solution { public int maximalSquare(char[][] matrix) { int m = matrix.length; if (m == 0) return 0; int n = matrix[0].length; int dp[][] = new int[m] ; int max = 0; for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) if (matrix[i][j] == '1') { dp[i][j] = 1; max = 1; } int maxL = Math.max(m, n); for (int l = 1; l < maxL; l++) { for (int i = 0; i < m - l; i++) for (int j = 0; j < n - l; j++) { if (dp[i][j] == l && dp[i][j + 1] == l && dp[i + 1][j] == l && dp[i + 1][j + 1] == l) { dp[i][j] = l + 1; max = dp[i][j]; } } } return max * max; } }
方法三:倒溯法,从最右下角来,如果dp[i][j] = min{dp[i+1][j], dp[i][j+1], dp[i+1][j+1] } +1
import java.util.*; public class Solution { public int maximalSquare(char[][] matrix) { int m = matrix.length; if (m == 0) return 0; int n = matrix[0].length; int dp[][] = new int[m] ; int max = 0; for (int i = 0; i < m; i++) if (matrix[i][n - 1] == '1') { dp[i][n - 1] = 1; max = 1; } for (int j = 0; j < n; j++) if (matrix[m - 1][j] == '1') { dp[m - 1][j] = 1; max = 1; } for (int i = m - 2; i >= 0; i--) for (int j = n - 2; j >= 0; j--) if (matrix[i][j] == '1') { dp[i][j] = Math.min(dp[i + 1][j + 1], Math.min(dp[i + 1][j], dp[i][j + 1])) + 1; max = Math.max(max, dp[i][j]); } return max * max; } }
相关文章推荐
- 疯狂的补贴,广州司机都被Uber触动
- MVC+EasyUI 菜单导航的实现
- MVC Razor 登录
- 黑马程序员——集合
- 设计模式 Singleton 单例 懒汉,线程安全
- 快速使用STVP和ST-LINK下载STM8S003程序
- 现代氧吧智能云音响,为何京东众筹能破百万
- 编写高质量的Objective-C代码(转)
- 2015.7.9 第四课 课程重点 (css :浮动、盒子模型、绝对/相对定位)
- 奔跑中的2015:Linux运维学习八大禁忌
- 寻找回文数的python的实现
- Uva11520 - Fill the Square
- Java 练习(多态,instanceof)
- Linux进程调度算法之O(1)算法
- (3)全e化的管理系统条件-3
- 赋值操作符和拷贝构造函数
- CSS3学习内容与心得
- 《学习OpenCV》第三章课后题8-a
- Oracle常用SQL语句
- UINavigationController