leetcode每日解题思路 221 Maximal Square
问题描述:

题目链接: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的更多相关文章
- 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 ...
- 【LeetCode】221. Maximal Square
Maximal Square Given a 2D binary matrix filled with 0's and 1's, find the largest square containing ...
- 求解最大正方形面积 — leetcode 221. Maximal Square
本来也想像园友一样,写一篇总结告别 2015,或者说告别即将过去的羊年,但是过去一年发生的事情,实在是出乎平常人的想象,也不具有代表性,于是计划在今年 6 月份写一篇 "半年总结" ...
- 【刷题-LeetCode】221. Maximal Square
Maximal Square Given a 2D binary matrix filled with 0's and 1's, find the largest square containing ...
- leetcode array解题思路
Array *532. K-diff Pairs in an Array 方案一:暴力搜索, N平方的时间复杂度,空间复杂度N 数组长度为10000,使用O(N平方)的解法担心TLE,不建议使用,尽管 ...
- [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 ...
- 【LeetCode】221. Maximal Square 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址: https://leet ...
- [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 ...
- (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 ...
随机推荐
- Android开发:Translucent System Bar 的最佳实践
Translucent System Bar 的最佳实践 近几天准备抽空总结Android一些系统UI的实践使用,于是开始动手建了一个库AndroidSystemUiTraining ,边撸代码边写总 ...
- Spring 3.x企业应用开发实战(14)----事务
Spring虽然提供了灵活方便的事务管理功能,但这些功能都是基于底层数据库本身的事务处理机制工作的.要深入了解Spring的事务管理和配置,有必要先对数据库事务的基础知识进行学习. 何为数据库事务 “ ...
- NOI 2014 感想
NOI2014结束了,我卡线登上了领奖台... 这是我第一次NOI,我觉得我收获了很多东西: 1.考前心态不重要,重要的是实力 真正考试的时候是顾不得想其他事情的 2.测试数据是人出的!不是随机的!不 ...
- Centos 6.5中使用yum安装jdk
默认会有open-jdk的安装 我们需要卸载 卸载过程: 查找rpm安装包 rpm –aq|grep java; 卸载 rpm –e –nodeps 安装包 查看目前是否通过yum进行安装jdk yu ...
- sdfsdf
http://www.cocoachina.com/bbs/read.php?tid-234704.html 选择工程->Build Settings -> Code Signing -& ...
- struts1.3异常处理机制
当Struts的控制器捕获到异常时,在异常处理块中,创建描述异常信息的ActionMessage对象,并放入ActionMessages对象中.然后把ActionMessages对象存放到一定范围内( ...
- 数学物理学报Offprints and Remuneration
- 016专家视图测试脚本开发_utility对象
utility对象(1)这个例子是:Extendtest使用Extend对象加载DLL,我们可以使用它来丰富windows api函数,能够编写更为强大和灵活的测试代码 实例代码: '声明FindWi ...
- 【转】傅里叶变换 拉普拉斯变 z变换 DFT DCT意义
傅里叶变换在物理学.数论.组合数学.信号处理.概率论.统计学.密码学.声学.光学.海洋学.结构动力学等领域都有着广泛的应用(例如在信号处理中,傅里叶变换的典型用途是将信号分解成幅值分量和频率分量). ...
- 自动计算label字体的高度和图片拉伸处理(封装成分类分享)
自动计算label字体的高度和图片拉伸处理 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bo ...