您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: