Maximal Rectangle
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
https://leetcode.com/problems/maximal-rectangle/
Solution I: brute force O(N^3)
取所有前面最小的延伸距离乘以当前离第一行的行数
http://www.cnblogs.com/lichen782/p/leetcode_maximal_rectangle.html
/**
* 以给出的坐标作为左上角,计算其中的最大矩形面积
* @param matrix
* @param row 给出坐标的行
* @param col 给出坐标的列
* @return 返回最大矩形的面积
*/
private int maxRectangle(char[][] matrix, int row, int col) {
int minWidth = Integer.MAX_VALUE;
int maxArea = 0;
for (int i = row; i < matrix.length && matrix[i][col] == '1'; i++) {
int width = 0;
while (col + width < matrix[row].length
&& matrix[i][col + width] == '1') {
width++;
}
if (width < minWidth) {// 如果当前宽度小于了以前的最小宽度,更新它,为下面的矩形计算做准备
minWidth = width;
}
int area = minWidth * (i - row + 1);
if (area > maxArea)
maxArea = area;
}
return maxArea;
}
Solution II: Optimized O(N^2)
find max area in histogram as a routine to calculate each row
why n+1 in height:
height[i][n] == 0, manually push 0 to stack to calculate all the elements in stack
check the code for max rectangle for histogram
public class Solution {
public int maximalRectangle(char[][] matrix) {
int m = matrix.length;
if (m == 0) {
return m;
}
int n = matrix[0].length;
int[][] height = new int[m][n+1]; // why n+1
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '0') {
height[i][j] = 0;
} else {
height[i][j] = i == 0 ? 1 : height[i-1][j] + 1;
}
}
}
int max = 0;
for (int i = 0; i < m; i++) {
int area = maxInLine(height[i]);
max = Math.max(area, max);
}
return max;
}
public int maxInLine(int[] height) {
int max = 0;
Stack<Integer> stack = new Stack<>();
int i = 0;
while (i < height.length) {
if (stack.isEmpty() || height[i] >= height[stack.peek()]) {
stack.push(i);
i++;
} else {
int n = stack.pop();
int curr = height[n] * (stack.isEmpty() ? i : i - stack.peek() - 1);
max = Math.max(max, curr);
}
}
return max;
}
}