本来也想像园友一样,写一篇总结告别 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. Asp.net MVC的Model Binder工作流程以及扩展方法(3) - DefaultModelBinder

    Default Binder是MVC中的清道夫,把守着Model Binder中的最后一道防线.如果我们没有使用Custom Model Binder等特殊处理,那么Model的绑定都是有Defaul ...

  2. HTML基础(四)——设置超链接的样式示例

     ***设置超链接的样式示例  a:link 超链接被点前状态 a:visited 超链接点击后状态 a:hover 悬停在超链接时 a:active 点击超链接时 在定义这些状态时,有一个顺序l v ...

  3. js中同步与异步请求方式

    异步请求方式: $.ajax({ url : 'your url', data:{name:value}, cache : false, async : true, type : "POST ...

  4. C# 和 C++ 数据类型对照表

    又要用C#调用C++写好的api函数,为了方便,将网上的数据类型做个整理,方便以后查找,以后遇到需要的在进行查找 C++ C#             WORD ushort     DWORD ui ...

  5. iOS 判断内容是否是中文,两种实现

    用category实现 新建类别文件,代码 .h文件 #import <Foundation/Foundation.h> @interface NSString (Valid) - (BO ...

  6. android中的数据存取-方式一:preference(配置)

    这种方式应该是用起来最简单的Android读写外部数据的方法了.他的用法基本上和J2SE(java.util.prefs.Preferences)中的用法一样,以一种简单. 透明的方式来保存一些用户个 ...

  7. Centos 内存占满 释放内存

    free -m 查看内存使用情况 top,然后按下shift+m,按内存占用百分比排序 centos 为了提高效率,把部分使用过的文件缓存到了内存里.如果不需要这样的文件性能,那就可以释放. 如下两个 ...

  8. 客户访问站点将bbs/链接 跳转至forum/链接下的两种方式

    显性 302 暂时重定向跳转 server { listen 80 ; server_name localhost; index index.html index.htm index.php; roo ...

  9. line-height1.5和line-height:150%的区别

    一.区别 区别体现在子元素继承时,如下: 父元素设置line-height:1.5会直接继承给子元素,子元素根据自己的font-size再去计算子元素自己的line-height. 父元素设置line ...

  10. 【Unity】矩阵运算

    http://www.cnblogs.com/wywnet/p/3585075.html Vector3:  Unity3D中Vector3类定义(只写有用的):  属性:  x,y,z       ...