问题描述:

题目链接:221 Maximal Square

问题找解决的是给出一个M*N的矩阵, 只有'1', '0',两种元素; 需要你从中找出 由'1'组成的最大正方形。恩, 就是这样。

我们看到, 这道题目的标签还是DP, 那么问题的关键就是要找到一个符合判断是否为正方形的递推式。

  老套路, 先看基本型, 对于一个2*2的正方形,对于右下角的元素(1,1)而言, 他的上(0,1), 左(1,0), 左上(0,0)三个元素应该都是'1',

如此才能够组成一个合规的正方形; 那么如果是一个3*3呢, 首先他必然是一个2*2, 然后左加一列,上添一行,就由一个2*2成了一个3*3型,所以, 对于在矩阵中的

任意一个点'1'只要不断匹配他的左边列和上边行都是‘1’, 并计数后再往外匹配一层,知道出现'0'或者到达边界即可, 然后从每个点中选出匹配到的最大层数, done!

  基本套路就是如此, 但是每个点都走一遍就是M*N个点, 后每个点都再外面一层逐个匹配, 时间复杂度消耗不起,O(M^2*N^2), 一般考虑M*N,直接近似4次方的复杂度,

肯定不可取。既然从后往前不靠谱, 那我们从前往后推又如何呢?

  除去边界(即第一行与第一列),对于任意一个matrix[i][i],他所处的方形应该前一层决定:左边(matrix[i][j-1]), 上边(matrix[i-1][j]),左上(matrix[i-1][j-1])决定,

同样的, 我们也需要一个结果矩阵 ret[M][N] 记录每个对应点所处的方形层数。

  再看最基本型:对于在matrix[1][1]出的点, 他的左上外层全为'1', 故这个点在ret[1][1]就+1,结果记为2,

即:if: (top != '0', left!='0', top_left!='0')

  then: ret[i][j] = matrix[i][j]+1;

  在考虑到这一步的时候, 觉得已经ok了, 立刻在页面写好代码提交, 结果却是一个大大的Wrong Answer! 当下觉得没错啊, 对于每个点是不是处于方形都做了

判断, 而且判定了之后还把层数+1嘞,于是输出结果矩阵一看:

  

很明显, 对于层数计算, 并没有获取前一层的都处于的方形层数, 要知道,假设在[i][j]为止是属于3*3的方形, 那么必然有点[i-1][j],[i][j-1], [i-1][j-1]这3个都至少属于

2*2的方形, 可能用图示更清楚:

  left:top:left_top:

所以上面的情形如果在递推产生的ret矩阵中就是这个样子:

    left:top:left_top:

所以, 更正后的递推式应该是:

  

再次提交, Accepted!

最后只解决的代码:

  

  另外, 还有一道相近的链接在这里), 这次不定形状了, 你是一行, 还是正方形没有限制了, 难度也提升为Hard级别,

但核心思想肯定没变, 各位额可以尝试下, 此题明后日贴个人解决思路。

  最后还是老话, 本人贴上来的解法和思路仅作是记录,或者还可以向各位看官交流学习,有帮助就好。

leetcode每日解题思路 221 Maximal Square的更多相关文章

  1. 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 ...

  2. 【LeetCode】221. Maximal Square

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

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

    本来也想像园友一样,写一篇总结告别 2015,或者说告别即将过去的羊年,但是过去一年发生的事情,实在是出乎平常人的想象,也不具有代表性,于是计划在今年 6 月份写一篇 "半年总结" ...

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

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

  5. leetcode array解题思路

    Array *532. K-diff Pairs in an Array 方案一:暴力搜索, N平方的时间复杂度,空间复杂度N 数组长度为10000,使用O(N平方)的解法担心TLE,不建议使用,尽管 ...

  6. [LeetCode] 3Sum 解题思路

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

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

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

  8. [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 ...

  9. (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 ...

随机推荐

  1. FORM Save : ORA-01403 FRM-40735 ORA-06502

    症状: FORM开发后挂上服务器后,运行保存按键提示: ORA-01403: 未找到任何数据 ----------------------------------------------------- ...

  2. 查找Form的文件名

    我们经常会要在ORACLE EBS中寻找我们正在浏览的form页面的执行文件,我们都会直接在Help中的菜单里点击"About Oracle Application",然后查看当前 ...

  3. 使用 Azure Site Recovery 灾难恢复至 Azure 的功能现已正式发布

    ABHISHEK A. HEMRAJANI 云 + Enterprise项目经理 自我们宣布发布使用 Azure SiteRecovery 灾难恢复至 Azure的功能预览版以来,这几个月着实令人 ...

  4. Azure 媒体服务发布可靠的视频直播平台

    Sudheer Sirivara Azure 媒体服务总监 两个月前,Azure 媒体服务发布了视频直播和内容保护产品的公共预览版.这一 Internet规模的直播解决方案已被十余家业界领先的国际广播 ...

  5. MongoDB中ObjectId的误区,以及引起的一系列问题

    近期对两个应用进行改造,在上线过程中出现一系列问题(其中一部分是由于ObjectId误区导致的) 先来了解下ObjectId: TimeStamp 前 4位是一个unix的时间戳,是一个int类别,我 ...

  6. Automator一键生成所需的iOS 图片icon

    iOS到8了, 终于受不了它的各种尺寸的icon了. 写一个Finder服务来一键生成吧. 拖放几次再重复, 无技术含量, 但很有用. // 存放目录    ~/资源库/Services/

  7. 部署解决方案包 (SharePoint Server 2010)

    转:http://technet.microsoft.com/zh-cn/library/cc262995(v=office.14).aspx 本文介绍各个解决方案包,及其在 Microsoft Sh ...

  8. Problems encountered while deleting resources.

    Error The project was not built due to “Problems encountered while deleting resources.”. Fix the pro ...

  9. 新浪微博2.5.1 for Android 去广告

    新浪微博更新到2.5.1版,就开始来广告了,伤不起啊... 亲,看到没,手机屏幕就那么一小块,还要往里面塞东西,另外是一个在后台运行的AdCenter服务. 所需要用到的工具有:apktool,JD- ...

  10. BZOJ2818: Gcd 莫比乌斯反演

    分析:筛素数,然后枚举,莫比乌斯反演,然后关键就是分块加速(分块加速在上一篇文章) #include<cstdio> #include<cstring> #include< ...