本来也想像园友一样,写一篇总结告别 2015,或者说告别即将过去的羊年,但是过去一年发生的事情,实在是出乎平常人的想象,也不具有代表性,于是计划在今年 6 月份写一篇 "半年总结",希望不会忘记。羊年,还是以一道有意思的算法题来告别吧!

Maximal Square,又是一道有意思的题。给出一个二维数组,数组中的元素是 1 或者 0,求解最大的由 1 组成的正方形面积。

比如这样一个二维数组:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

很显然最大的正方形面积为 2*2=4。

根据经验,一眼便看出这是一道 动态规划 题。我们用 dp[i][j] 表示以 matrix[i][j] 为右下角的最大全 1 正方形的边长,仔细思考,如何推得 dp[i][j] 的递推公式?

dp[i][j] 可以从三部分推得,首先是 dp[i-1][j-1],然后是 matrix[i][j] 左边的连续 1 的个数,然后是 matrix[i][j] 上面连续 1 的个数,这三部分取最小值。于是我们可以维护三个数组,dp[i][j] 表示以 matrix[i][j] 为右下角的全 1 正方形的边长,a[i][j] 表示从 matrix[i][j] 往左的连续 1 的个数,b[i][j] 表示从 matrix[i][j] 往上的连续 1 的个数。

可以推得(注意边界值):

if (matrix[i][j] === '1') {
  dp[i][j] = Math.min(i && j ? dp[i - 1][j - 1] : 0, j ? a[i][j - 1] : 0, i ? b[i - 1][j] : 0) + 1;
  a[i][j] = j ? a[i][j - 1] + 1 : 1;
  b[i][j] = i ? b[i - 1][j] + 1 : 1;

  ans = dp[i][j] > ans ? dp[i][j] : ans;
} else {
  dp[i][j] = a[i][j] = b[i][j] = 0;
}

需同时更新三个数组的值,完整代码可以参考 index_1.js

当然这还不算完,继续优化。我们以 a 数组为例,其实 a 数组完全能用 dp 数组代替。

  • 当 a[i][j-1] <= dp[i-1][j-1] 时,Math.min(dp[i-1][j-1], a[i][j-1]) 的结果就是 a[i][j-1],也就是 dp[i][j-1]
  • 当 a[i][j-1] > dp[i-1][j-1] 时,Math.min(dp[i-1][j-1], a[i][j-1]) 的结果就是 dp[i-1][j-1]

所以 Math.min(dp[i-1][j-1], a[i][j-1]) 的结果也就是 dp[i-1][j-1], dp[i][j-1])。数组 b 同理。

所以程序可以将转移方程优化为:

if (matrix[i][j] === '1') {
  dp[i][j] = Math.min(i && j ? dp[i - 1][j - 1] : 0, j ? dp[i][j - 1] : 0, i ? dp[i - 1][j] : 0) + 1;

  ans = dp[i][j] > ans ? dp[i][j] : ans;
} else {
  dp[i][j] = 0;
}

完整代码可以参考 index_2.js

今天是除夕,最后祝大家在新的一年里身体健康,心想事成!!最重要的还是身体健康,身体健康,身体健康!!!重要的事情说三遍!!!

求解最大正方形面积 — leetcode 221. Maximal Square的更多相关文章

  1. 求解最大矩形面积 — leetcode 85. Maximal Rectangle

    之前切了道求解最大正方形的题,题解猛戳 这里.这道题 Maximal Rectangle 题意与之类似,但是解法完全不一样. 先来看这道题 Largest Rectangle in Histogram ...

  2. [LeetCode] 221. Maximal Square 最大正方形

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...

  3. (medium)LeetCode 221.Maximal Square

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...

  4. Leetcode 221. Maximal Square

    本题用brute force超时.可以用DP,也可以不用. dp[i][j] 代表 以(i,j)为右下角正方形的边长. class Solution(object): def maximalSquar ...

  5. Java for LeetCode 221 Maximal Square

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...

  6. [LeetCode] 221. Maximal Square _ Medium Tag: Dynamic Programming

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and re ...

  7. leetcode每日解题思路 221 Maximal Square

    问题描述: 题目链接:221 Maximal Square 问题找解决的是给出一个M*N的矩阵, 只有'1', '0',两种元素: 需要你从中找出 由'1'组成的最大正方形.恩, 就是这样. 我们看到 ...

  8. 【LeetCode】221. Maximal Square 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址: https://leet ...

  9. 【刷题-LeetCode】221. Maximal Square

    Maximal Square Given a 2D binary matrix filled with 0's and 1's, find the largest square containing ...

随机推荐

  1. ADO.Net(一)——增、删、改、查

    数据访问 对应命名空间:System.Data.SqlClient; SqlConnection:连接对象 SqlCommand:命令对象 SqlDataReader:读取器对象 CommandTex ...

  2. JQuery插件:遮罩+数据加载中。。。(特点:遮你想遮,罩你想罩)

    在很多项目中都会涉及到数据加载.数据加载有时可能会是2-3秒,为了给一个友好的提示,一般都会给一个[数据加载中...]的提示.今天就做了一个这样的提示框. 先去jQuery官网看看怎么写jQuery插 ...

  3. 十五天精通WCF——第九天 高级玩法之自定义Behavior

    终于我又看完了二期爱情保卫战,太酸爽了,推荐链接:http://www.iqiyi.com/a_19rrgublqh.html?vfm=2008_aldbd,不多说,谁看谁入迷,下面言归正传, 看看这 ...

  4. php配置php-fpm启动参数及配置详解

    约定几个目录 /usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/etc/php.ini一,php-fpm ...

  5. .NET/ASP.NET 4.5 Bundle组件(捆绑、缩小静态文件)

    阅读目录: 1.开篇介绍 2.System.Web.Optimization 组件 3.System.Web.Optimization 组件基本原理 4.扩展自定义类型静态文件 1]开篇介绍 这篇文章 ...

  6. mysql set names 命令和 mysql 字符编码问题

    先看下面的执行结果: (root@localhost)[(none)]mysql>show variables like 'character%'; +--------------------- ...

  7. Spring mvc框架 controller间跳转 ,重定向 ,传参

     一.需求背景     1. 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示.   @Req ...

  8. x01.os.9: 进程切换

    进入内核后,当然不能无所事事.先创建三个进程,分别打印 A,B,C.虽然只是简单的打印,但却是一切扩展的基础,不可等闲视之. 进程切换,涉及一系列的寄存器需要保护,于是,就有了 ProcessStac ...

  9. mysql 远程访问控制

    如需要让192.168.2.3的test用户可以访问本机所有数据库,mysql命令如下 mysql>GRANT ALL PRIVILEGES ON *.* TO 'test'@'192.168. ...

  10. 启动mysql错误ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)

    ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ ( ...