Largest Rectangle in Histogram 升级版。对于矩阵每行,可以看成是这个问题。height array对于相邻的行,假如当前的matrix[i][j] = 0,则无视上一行且当前height[j] = 0,如果matrix[i][j] = 1,则加上之前的height[j] += 1。
public class Solution { //Time: O(m*n) Space: O(n) public int maximalRectangle(char[][] matrix) { if (matrix == null || 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++) { height[j] = matrix[i][j] == '0' ? 0 : height[j] + 1; } int cur = largestRectangleArea(height); max = Math.max(max, cur); } return max; } public int largestRectangleArea(int[] height) { int max = 0; Stack<Integer> stack = new Stack<Integer>(); for (int i = 0; i <= height.length; i++) { int h = i == height.length ? -1 : height[i]; while (!stack.isEmpty() && h < height[stack.peek()]) { int index = stack.pop(); int w = stack.isEmpty() ? i : i - stack.peek() - 1; max = Math.max(max, w * height[index]); } stack.push(i); } return max; } }
No comments:
Post a Comment