https://oj.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
public int maximalRectangle(char[][] matrix)
Leetcode 把这一题放在Largest Rectangle这一题后面其实就是这一题最大的提示了。
这一题的做法如果没有思路的话是很难的,基本上你很难在不expensive的情况下画清楚一个范围是否矩形。但上一题就给了一个合适的解法。
实际上这一题做法在懂的上一题之后就变得很简单了。其实就是从第一层扫到最后一层,不停构建供给上一题用的histogram,然后根据上一题的解法一行行的解就可以了。
给出代码如下:
public int maximalRectangle(char[][] matrix) {
if(matrix.length == 0 || matrix[0].length == 0)
return 0;
int[] cur_histogram = new int[matrix[0].length];
int res = 0;
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
if(matrix[i][j] == '0')
cur_histogram[j] = 0;
else
cur_histogram[j]++;
}
res = Math.max(res, maxRectinHistogram(cur_histogram));
}
return res;
}
public int maxRectinHistogram(int[] height){
Stack<Integer> index_stack = new Stack<Integer>();
int res = 0;
for(int i = 0; i < height.length; i++){
if(index_stack.isEmpty() || height[i] >= height[index_stack.peek()])
index_stack.push(i);
else{
while(!index_stack.isEmpty() && height[index_stack.peek()] > height[i]){
int cur_bar = index_stack.pop();
int prev_bar = index_stack.isEmpty() ? -1 : index_stack.peek();
res = Math.max(res, height[cur_bar] * (i - prev_bar - 1));
}
index_stack.push(i);
}
}
while(!index_stack.isEmpty()){
int cur_bar = index_stack.pop();
int prev_bar = index_stack.isEmpty() ? -1 : index_stack.peek();
res = Math.max(res, height[cur_bar] * (height.length - prev_bar - 1));
}
return res;
}