Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing only 1’s and return its area.
Example:
Input:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
Output: 6
这道题的一个巧妙的思路是基于这道题的:LeetCode 84. Largest Rectangle in Histogram
Python解法如下:
class Solution:
# Get the maximum area in a histogram given its heights
def leetcode84(self, heights):
stack = [-1]
maxarea = 0
for i in range(len(heights)):
while stack[-1] != -1 and heights[stack[-1]] >= heights[i]:
maxarea = max(maxarea, heights[stack.pop()] * (i - stack[-1] - 1))
stack.append(i)
while stack[-1] != -1:
maxarea = max(maxarea, heights[stack.pop()] * (len(heights) - stack[-1] - 1))
return maxarea
def maximalRectangle(self, matrix: List[List[str]]) -> int:
if not matrix: return 0
maxarea = 0
dp = [0] * len(matrix[0])
for i in range(len(matrix)):
for j in range(len(matrix[0])):
# update the state of this row's histogram using the last row's histogram
# by keeping track of the number of consecutive ones
dp[j] = dp[j] + 1 if matrix[i][j] == '1' else 0
# update maxarea with the maximum area from this row's histogram
maxarea = max(maxarea, self.leetcode84(dp))
return maxarea
java解法如下:
class Solution {
// Get the maximum area in a histogram given its heights
public int leetcode84(int[] heights) {
Stack < Integer > stack = new Stack < > ();
stack.push(-1);
int maxarea = 0;
for (int i = 0; i < heights.length; ++i) {
while (stack.peek() != -1 && heights[stack.peek()] >= heights[i])
maxarea = Math.max(maxarea, heights[stack.pop()] * (i - stack.peek() - 1));
stack.push(i);
}
while (stack.peek() != -1)
maxarea = Math.max(maxarea, heights[stack.pop()] * (heights.length - stack.peek() -1));
return maxarea;
}
public int maximalRectangle(char[][] matrix) {
if (matrix.length == 0) return 0;
int maxarea = 0;
int[] dp = new int[matrix[0].length];
for(int i = 0; i < matrix.length; i++) {
for(int j = 0; j < matrix[0].length; j++) {
// update the state of this row's histogram using the last row's histogram
// by keeping track of the number of consecutive ones
dp[j] = matrix[i][j] == '1' ? dp[j] + 1 : 0;
}
// update maxarea with the maximum area from this row's histogram
maxarea = Math.max(maxarea, leetcode84(dp));
} return maxarea;
}
}