题目
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
思路
这个题可以看成上一题 84. 柱状图中最大的矩形(单调栈) 的拓展,我们一行一行的来分析这个矩阵:
第一行:[1, 0, 1, 0, 0];第一至二行:[2, 0, 2, 1, 1];第一至三行:[3, 1, 3, 2, 2];、第一至四行:[4, 0, 0, 3, 0];
显然拆成每行来看的话,就是求第一行到第 i 行组成的柱状图中的最大矩形,那么解法就很简单了;
代码
class Solution {
public int largestRectangleArea(int[] heights
) {
int ans
= 0;
Deque
<Integer> stack
= new ArrayDeque<>();
for (int i
=0; i
<heights
.length
; i
++){
while (!stack
.isEmpty() && heights
[i
] < heights
[stack
.peek()]){
int h
= heights
[stack
.pop()];
ans
= Math
.max(ans
, h
*(i
-stack
.peek()-1));
}
stack
.push(i
);
}
return ans
;
}
public int maximalRectangle(char[][] matrix
) {
if (matrix
.length
== 0)
return 0;
int ans
= 0;
int[] temp
= new int[matrix
[0].length
+2];
for (char[] chars
: matrix
) {
for (int j
=0; j
<chars
.length
; j
++) {
if (chars
[j
] != '0')
temp
[j
+1]++;
else
temp
[j
+1] = 0;
}
ans
= Math
.max(ans
, largestRectangleArea(temp
));
}
return ans
;
}
}