求解最大正方形面积 — leetcode 221. Maximal Square

时间:2022-08-31 14:19:51

本来也想像园友一样,写一篇总结告别 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&period; Maximal Rectangle

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

  2. &lbrack;LeetCode&rsqb; 221&period; 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. &lpar;medium&rpar;LeetCode 221&period;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&period; 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. &lbrack;LeetCode&rsqb; 221&period; Maximal Square &lowbar; Medium Tag&colon; 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&period; Maximal Square 解题报告(Python & C&plus;&plus;)

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

  9. 【LeetCode】221&period; Maximal Square

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

随机推荐

  1. 搭建一个分布式MongoDB鉴权集群

    今天休假在家,测试并搭建了一个replica set shard MongoDB鉴权集群.replica set shard 鉴权集群中文资料比较少,本文是个人笔记,同时也希望对后来者有所帮助.本文仅 ...

  2. val&comma; lazy&comma; def

    val strVal = scala.io.Source.fromFile("test.txt").mkString //在strVal被定义的时候获取值,如果test.txt不存 ...

  3. &lbrack;PointCloud&rsqb; GICP

    泛化的ICP算法,通过协方差矩阵起到类似于权重的作用,消除某些不好的对应点在求解过程中的作用.不过可以囊括Point to Point,Point to Plane的ICP算法,真正的是泛化的ICP. ...

  4. 63&period; Swap Nodes in Pairs &amp&semi;&amp&semi; Rotate List &amp&semi;&amp&semi; Remove Nth Node From End of List

    Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For exam ...

  5. android sqlite 中存储 long 数据

    在資料庫的技術中,一個資料庫(Database)表示應用程式儲存與管理資料的單位,應用程式可能需要儲存很多不同的資料,例如一個購物網站的資 料庫,就需要儲存與管理會員.商品和訂單資料.每一種在資料庫中 ...

  6. matlab 全部的随机数函数

    matlab 全部的随机数函数 (一)Matlab内部函数 a. 基本随机数 Matlab中有两个最基本生成随机数的函数. 1.rand() 生成(0,1)区间上均匀分布的随机变量.基本语法: ran ...

  7. localstorage &vert;&vert; globalStorage &vert;&vert; userData

    globalStorage 这个也是html5中提出来,在浏览器关闭以后,使用globalStorage存储的信息仍能够保留下来,并且存储容量比IE的userdata大得多,一个域下面是5120k.和 ...

  8. MFC的杂七杂八

    1.判断焦点当前所在控件 2.动态移动控件位置 3.GDI+绘制文字 4.编辑框跳变显示 5.最大化显示 6.Uint uFormat常用值 7.获取菜单个数 8.添加气泡提示 9.编辑框输入时响应函 ...

  9. go(一)变量

    package main import ( "fmt" ) func main() { var a int a = var a1 string a1 = "my is a ...

  10. Codeforces Round &num;441&lpar;Div&period;2&rpar; F - High Cry

    F - High Cry 题目大意:给你n个数,让你找区间里面所有数或 起来大于区间里面最大数的区间个数. 思路:反向思维,找出不符合的区间然后用总数减去.我们找出每个数掌控的最左端 和最右端,一个数 ...