Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
这道题两个解法,第一个
http://blog.csdn.net/doc_sgl/article/details/11832965
第二个稍有不同
public 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 max = 0;
int[] height = new int[n];
Arrays.fill(height, 0);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '0') {
height[j] = 0;
} else {
height[j] = height[j] + 1;
}
}
max = Math.max(max, maximalRectangleHelper(height));
}
return max;
}
private int maximalRectangleHelper(int[] heights) {
Stack<Integer> index = new Stack<Integer>();
Stack<Integer> height = new Stack<Integer>();
int max = 0;
for (int i = 0; i < heights.length; i++) {
int lastPos = i;
while (!height.isEmpty() && heights[i] <= height.peek()) {
lastPos = index.pop();
max = Math.max(max, (i - lastPos) * height.pop());
}
index.push(lastPos);
height.push(heights[i]);
}
while (!height.isEmpty() ) {
max = Math.max(max, (heights.length - index.pop()) * height.pop());
}
return max;
}
}