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.
思路:学会了 Largest Rectangle in Histogram ,把矩阵的以每一列为底的histogram求出来,然后每个row带入到 largest rectangle in histogram的函数中去求最大的矩阵,那么就是这题的答案; 这题难点在于如何生成投影的矩阵,首先声明一个一模一样的size的矩阵,然后初始化第一行,然后根据上面一行生成下一行,然后用投影矩阵去计算;
class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return 0;
}
int m = matrix.length;
int n = matrix[0].length;
int[][] A = new int[m][n];
int res = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(i == 0) {
A[i][j] = matrix[i][j] == '0' ? 0 : 1;
} else {
if(matrix[i][j] == '0') {
A[i][j] = 0;
} else {
A[i][j] = A[i - 1][j] + 1;
}
}
}
res = Math.max(res, largestRectangleArea(A[i]));
}
return res;
}
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack = new Stack<>();
int maxarea = 0;
for(int i = 0; i <= heights.length; i++) {
if(stack.isEmpty()) {
stack.push(i);
} else {
int curval = (i == heights.length) ? -1 : heights[i];
while(!stack.isEmpty() && heights[stack.peek()] >= curval) {
int j = stack.pop();
int left = stack.isEmpty() ? 0 : stack.peek() + 1;
int right = i - 1;
int len = right - left + 1;
maxarea = Math.max(maxarea, len * heights[j]);
}
stack.push(i);
}
}
return maxarea;
}
}