LeetCode – Maximal Rectangle (Java)

Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing all ones and return its area.

Analysis

This problem can be converted to the “Largest Rectangle in Histogram” problem.

Java Solution

public int maximalRectangle(char[][] matrix) {
	int m = matrix.length;
	int n = m == 0 ? 0 : matrix[0].length;
	int[][] height = new int[m][n + 1];
 
	int maxArea = 0;
	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;
			}
		}
	}
 
	for (int i = 0; i < m; i++) {
		int area = maxAreaInHist(height[i]);
		if (area > maxArea) {
			maxArea = area;
		}
	}
 
	return maxArea;
}
 
private int maxAreaInHist(int[] height) {
	Stack<Integer> stack = new Stack<Integer>();
 
	int i = 0;
	int max = 0;
 
	while (i < height.length) {
		if (stack.isEmpty() || height[stack.peek()] <= height[i]) {
			stack.push(i++);
		} else {
			int t = stack.pop();
			max = Math.max(max, height[t]
					* (stack.isEmpty() ? i : i - stack.peek() - 1));
		}
	}
 
	return max;
}

8 thoughts on “LeetCode – Maximal Rectangle (Java)”

  1. maxAreaInHist fails for H = {1,2,1,3,3,2,1}. After the while loop, if stack is not empty, you should still calculate the area for remaining elements. Your code outputs 6, whereas the actual max area is 7

  2. This is pretty awesome. Finding connections between different problems is better than solving the problem itself.

  3. It will not. Because height[] has one additional element at the end which is 0 ( int[][] height = new int[m][n + 1];) . So even if the elements are in increasing order, zero will be at the end, so non increasing. ๐Ÿ™‚

  4. Hi, I have a question about the maxAreaInHist() method: if the heights are in ascending order, the max will remain zero all the time. This is a bug right?

Leave a Comment