Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
设一个数组表示从第一行开始遍历的当前列的高度,再用largest rectangle in histogram那道题的方法算最大面积。
Source
public class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix.length == 0)
return 0;
int max = 0;
int[] height = new int[matrix[0].length];
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
if(matrix[i][j] == '0')
height[j] = 0;
else height[j] = height[j] + 1;
}
max = Math.max(largest(height), max);
}
return max;
}
public int largest(int[] height){
Stack<Integer> stack = new Stack<Integer>();
int i = 0;
int max = 0;
int[] hei = new int[height.length + 1];
hei = Arrays.copyOf(height, height.length + 1);
while(i < hei.length){
if(stack.isEmpty() || hei[stack.peek()] <= hei[i]){
stack.push(i++);
}
else{
int temp = stack.pop();
max = Math.max(max, hei[temp] * (stack.isEmpty() ? i : i - stack.peek() - 1));
}
}
return max;
}
}
Test
public static void main(String[] args){
char[][] matrix = {{'1','0','0','0'},{'0','1','1','0'},{'0','1','1','0'},{'0','0','0','1'}};
System.out.println(new Solution().maximalRectangle(matrix));
}