小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
85. 最大矩形
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
- 示例 1:
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]] 输出:6 解释:最大矩形如上图所示。
- 示例 2:
输入:matrix = [] 输出:0
- 示例 3:
输入:matrix = [["0"]] 输出:0
- 示例 4:
输入:matrix = [["1"]] 输出:1
- 示例 5:
输入:matrix = [["0","0"]] 输出:0
提示:
- rows == matrix.length
- cols == matrix[0].length
- 0 <= row, cols <= 200
- matrix[i][j] 为 '0' 或 '1'
解题思路
利用84. 柱状图中最大的矩形的代码,我们只需要将连续的1计算为高度,就和那题没什么区别了
代码
class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix.length==0) return 0;
int[] h=new int[matrix[0].length];
int res=0;
for(int i=0;i<matrix.length;i++)
{
for(int j=0;j<matrix[0].length;j++)
{
if(matrix[i][j]=='0')
{
h[j]=0;
}else h[j]++;
}
res=Math.max(res,largestRectangleArea(h));
}
return res;
}
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack=new Stack<>();
int n=heights.length;
int[] nh=new int[n+2];
for(int i=0;i<n;i++)
nh[i+1]=heights[i];
int res=0;
for(int i=0;i<n+2;i++)
{
while(!stack.isEmpty()&&nh[i]<nh[stack.peek()]){
int j=stack.pop(),h=nh[j];
int w=i-stack.peek()-1;
res=Math.max(res,h*w);
}
stack.push(i);
}
return res;
}
}
时间复杂度:O(m^2n),其中 m 和 n 分别是矩阵的行数和列数。计算 left 矩阵需要 O(mn) 的时间。随后对于矩阵的每个点,需要 O(m) 的时间枚举高度。故总的时间复杂度为 O(mn) + O(mn) * O(m) = O(m^2n)
空间复杂度:O(mn),其中 m 和 n 分别是矩阵的行数和列数。我们分配了一个与给定矩阵等大的数组,用于存储每个元素的左边连续 1 的数量。