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的方法进行求解
public int maximalRectangle(char[][] matrix) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return 0;
int row = matrix.length,col = matrix[0].length;
int maxarea = 0;
int[][] area = new int[row][col];
for(int i = 0;i < row;i++){
for(int j = 0; j < col;j++){
if(i == 0){
area[i][j] = matrix[i][j]-'0';
continue;
}
if(matrix[i][j] == '1'){
area[i][j] = 1+area[i-1][j];
}
}
}
for(int i = 0;i < row ; i++){
maxarea = Math.max(maxarea,maxR(area[i]));
}
return maxarea;
}
private int maxR(int[] nums){
LinkedList<Integer> index = new LinkedList<Integer>();
LinkedList<Integer> height = new LinkedList<Integer>();
int maxarea = 0;
for(int i = 0;i < nums.length;i++){
if(index.isEmpty() || nums[i] >= height.peek()){
index.push(i);
height.push(nums[i]);
}
else{
int j = 0;
while(!index.isEmpty() && nums[i] < height.peek()){
j = index.peek();
int tmp = (i-index.pop())*height.pop();
maxarea = Math.max(tmp,maxarea);
}
index.push(j);
height.push(nums[i]);
}
}
while(!index.isEmpty()){
int tmp = (nums.length-index.pop())*height.pop();
maxarea = Math.max(tmp,maxarea);
}
return maxarea;
}