LeetCode (85): Maximal Rectangle [含84题分析]
2015-10-20 10:20
239 查看
链接: https://leetcode.com/problems/maximal-rectangle/
【描述】Given a 2D binary matrix filled with '0's and '1's, find the largest rectangle containing all ones and return its area.
【中文描述】
给一个二维数组, 算出里面最大的全1矩形面积,比如:
[
['1','1','1','0'],
['1','1','1','1']
]
显然,最大矩形面积是6, 就是图中粗体1组成的矩形。
————————————————————————————————————————————————————————————
【初始思路】
刚拿到题的时候毫无头绪, 想了半天想了个O(n3)的算法,遍历每一行,从每一行开始和后面的行进行'&'操作,每一步把与的结果和层数相乘得到面积,更新到max中, 最后返回max。
代码我根本没写,这个题肯定没这么蠢,写出来肯定也是TLE。
【Discuss】
最后无奈,去discuss看了下大家的做法,竟然看到了DP做法!当时惊呆了。根据最近学习DP的成果来看,DP用来计算那些求方案总数,求能不能等只需要最终结果的题非常适用。最大最小也可以用DP,但是我怎么都没想到要用DP去做这个题!毕竟这个题的DP递推函数太难构造了,所以就放弃了。后来看了大神的解法,顿时把膝盖跪烂了!!!也不得不承认,人和人之间智力的差距太大了!
这里先介绍下DP算法。
【解法一: DP】
这个题的DP函数确实很复杂,很抽象,也太难构造出来了。如果面试时候在毫无准备的时候想到这个函数的构造方法的,基本可以当场hire你了!
我来介绍一下大神算法的核心思想:
(1)以行为单位来看
(2)每一行计算当前情况以及之前行的积累情况, 根据两者的比较计算, 将计算结果存储在中间结果数组当前行里, 供下一行用,这确实是DP思想。
(3)每一行实时计算走到当前行,最大矩形的面积。
上面的描述太笼统,(1)(3)好理解, 对于DP来讲,这是肯定的。(2)的理解是本解法的精髓和核心。(2)理解了,这个算法其实非常简单!
那么,如何来做所谓的当前行的计算呢?
首先,可以确定的是,对于每一行来说, 肯定还是得根据不同的列来分别计算对待, 我们用 i 标记行,用 j 标记列。
那么DP函数到底怎么构造?二维数组?我们来分析下二维数组到底行不行。
我们定义dp[i][j]表示从[0][0]到[i][j]位置这个范围内最大的矩阵面积。看似合理,我们看下面这个例子:
public static int largestRectangleArea(int[] height) { if (height == null || height.length == 0 ) return 0; Stack<Integer> stack = new Stack<Integer>(); int res = 0; int i = 0; while(i < height.length) { while(!stack.isEmpty() && height[stack.peek()] >= height[i]) { int index = stack.pop(); int temp = stack.isEmpty() ? i * height[index] : ( (i - 1) - (stack.peek() + 1) + 1 ) * height[index]; res = Math.max(res,temp); } stack.push(i); i++; } int count = 1; while (!stack.isEmpty()) { int index = stack.pop(); if (!stack.isEmpty() && height[index] == height[stack.peek()]) { count++; continue; } int temp = count * height[index]; res = Math.max(res,temp); temp = stack.isEmpty() ? i * height[index] : ( i - stack.peek() - 1 ) * height[index]; res = Math.max(res,temp); } return res; }
largestRectangleArea
相关文章推荐
- mysql 通过使用联全索引优化Group by查询
- qt中快捷键
- java 多线程 CountDownLatch用法
- 最大团问题
- 并行计算思考----回溯法求解数独问题
- Servlet学习笔记
- 并行计算思考----回溯法求解数独问题
- Servlet学习笔记
- web测试方法总结(四)
- 主要继承方式
- Mac 下安装、卸载Java 7
- IT研发测试类笔试(第二篇
- Oracle 编译、调用或调试Procedure、Function或Package时卡死问题
- DotNet中FTP操作
- HDFS的架构及原理
- iOS_mapKit与Core Location
- web测试方法总结(三)
- 在Android上实现图像颜色过滤与反转
- 26个提升java性能需要注意的地方
- NSNumber(把数字存进数组字典等的问题)