221. 最大正方形

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

示例:

输入:

1 0 1 0 0

1 0 1 1 1

1 1 1 1 1

1 0 0 1 0

输出: 4

PS:

当我们判断以某个点为正方形右下角时最大的正方形时,那它的上方,左方和左上方三个点也一定是某个正方形的右下角,否则该点为右下角的正方形最大就是它自己了。这是定性的判断,那具体的最大正方形边长呢?

我们知道,该点为右下角的正方形的最大边长,最多比它的上方,左方和左上方为右下角的正方形的边长多1,最好的情况是是它的上方,左方和左上方为右下角的正方形的大小都一样的,这样加上该点就可以构成一个更大的正方形。

但如果它的上方,左方和左上方为右下角的正方形的大小不一样,合起来就会缺了某个角落,这时候只能取那三个正方形中最小的正方形的边长加1了。

假设dpi表示以i,j为右下角的正方形的最大边长,则有 dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1 当然,如果这个点在原矩阵中本身就是0的话,那dp[i]肯定就是0了。

难搞哦~想了半天,才弄明白,为什么?(ง •_•)ง

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;
}
}

最新文章

  1. 性能优化方法(Z)
  2. Oracle数据块损坏篇之10231内部事件
  3. @SuppressWarnings的参数
  4. Creating Custom Login Screen In Oracle Forms 10g
  5. 小组项目beta发布的评价
  6. H-The Cow Lineup(POJ 1989)
  7. C与Python变量的区别
  8. phpstorm一个窗口打开多个项目
  9. State of Hyperparameter Selection
  10. java web 学习十六(JSP指令)
  11. python会什么比c慢
  12. linux(vi)多行注释和取消注释.
  13. Ansible 变量
  14. Γ(a) 的两种方差与均值
  15. Eruda 一个被人遗忘的移动端调试神器
  16. Oracle DBA最常用的269条命令
  17. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT
  18. Android——媒体库 相关知识总结贴
  19. IOP开发数据库--20180105整理
  20. linux cp操作,每天学习一点

热门文章

  1. neo4j 图数据库安装及介绍
  2. python100例 11-20
  3. 【Android】是时候为你的应用加上WebDav同步了
  4. 【雕爷学编程】Arduino动手做(54)---大按键点动模块
  5. Redis学习笔记(十三) 复制(下)
  6. 移除项目中的UIWebView
  7. 如何利用BeautifulSoup选择器抓取京东网商品信息
  8. GO 使用Webhook 实现github 自动化部署
  9. HTML特殊符号整理
  10. mybatis的一堆多映射使用配置