Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
For example, given the following matrix:
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0
Return 6.
这题需要借用84题的解题思路,使用stack,不过即使知道这点,也不是那么容易就知道怎么做。
在翻了好几份答案之后看到了一个讲解的还不错的博客:http://blog.csdn.net/jiyanfeng1/article/details/8068676
题目标签里面有DP 在这个思路中构造表示每列柱状高度的二维数组的过程就用到了DP,其实也可以简化为只使用一个一维数组,没遍历一行更新一次该数组,同时运用84题思路就可以解出在该行之下的最大子矩阵。
下面是我的JAVA实现,stack使用的jdk自带的stack,在提交的答案中性能一般,使用数组可以继续优化。
public class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
return 0;
int height[] = new int[matrix[0].length+ 1];
for(int i = 0 ; i < matrix[0].length+ 1 ; i ++)
height[i] = 0;
Stack<Integer> stack = new Stack<Integer>();
int res = 0;
for(int i = 0 ; i < matrix.length ; i ++){
for(int j = 0 ; j < matrix[0].length ; j ++){
if(matrix[i][j] == '1')
height[j] ++;
else
height[j] = 0;
}
if(!stack.empty())
stack.clear();
for(int j = 0 ; j <= matrix[0].length ; j ++){
while( !stack.empty() && height[j] < height[stack.peek()] ){
int tmp = height[stack.pop()];
int len = stack.empty() ? j : j -stack.peek() -1;
res = Math.max(len*tmp, res);
}
stack.push(j);
}
}
return res;
}
}