Given a rows x cols
binary matrix
filled with 0
's and 1
's, find the largest rectangle containing only 1
's and return its area.
Example 1:
Input: matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
Output: 6
Explanation: The maximal rectangle is shown in the above picture.
Example 2:
Input: matrix = []
Output: 0
Example 3:
Input: matrix = [["0"]]
Output: 0
Example 4:
Input: matrix = [["1"]]
Output: 1
Example 5:
Input: matrix = [["0","0"]]
Output: 0
Constraints:
rows == matrix.length
cols == matrix.length
0 <= row, cols <= 200
matrix[i][j]
is'0'
or'1'
.
This problem's optimal solution builds on its related problem: Largest Rectangle in Histogram. If we treat each row as the new base line of a histogram, we can get the largest rectangle in O(Col) time. We need to do this O(Row) time by keeping a prefix sum array h[], where h[i] is the height of the ith column in the current histogram.
The runtime is O(Row * Col) and is BCR.
class Solution { public int maximalRectangle(char[][] matrix) { if(matrix.length == 0) { return 0; } int m = matrix.length, n = matrix[0].length, ans = 0; int[] h = new int[n]; for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { h[j] = (matrix[i][j] == '0' ? 0 : h[j] + 1); } ans = Math.max(ans, largestRectangeleHistogram(h)); } return ans; } private int largestRectangeleHistogram(int[] h) { ArrayDeque<Integer> dq = new ArrayDeque<>(); dq.addLast(-1); int best = 0; for(int i = 0; i < h.length; i++) { while(dq.peekLast() >= 0 && h[i] < h[dq.peekLast()]) { int j = dq.pollLast(); best = Math.max(best, h[j] * (i - 1 - dq.peekLast())); } dq.addLast(i); } while(dq.peekLast() >= 0) { int j = dq.pollLast(); best = Math.max(best, h[j] * (h.length - 1 - dq.peekLast())); } return best; } }