题目
给定一个仅包含 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
题解
class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix.length==0||matrix[0].length==0){
return 0;
}
int row=matrix.length;//行数
int col=matrix[0].length;//列数
int[] heights=new int[col];
int ans=0;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(matrix[i][j]=='1'){//char
heights[j]+=1;
}else{
heights[j]=0;
}
}
ans=Math.max(ans,largestRectangleArea(heights));
}
return ans;
}
public int largestRectangleArea(int[] heights){
int res=0;
Deque<Integer> stack=new ArrayDeque<>();//ArrayDeque!
int[] newHeights=new int[heights.length+2];
for(int i=0;i<heights.length;i++){
newHeights[i+1]=heights[i];
}//数组前后补0
for(int i=0;i<newHeights.length;i++){
while(!stack.isEmpty()&&newHeights[i]<newHeights[stack.peek()]){
//栈顶元素大于当前遍历到的元素,则第i根柱子为最矮柱子所能延伸的最大面积可求得
int h=stack.pop();//h是index...
res=Math.max(res,(i-stack.peek()-1)*newHeights[h]);
}
stack.push(i);
}
return res;
}
}
笔记:
-
每一层看作是柱状图,可以套用84题柱状图的最大面积。
第一层柱状图的高度[“1”,“0”,“1”,“0”,“0”],最大面积为1;
第二层柱状图的高度[“2”,“0”,“2”,“1”,“1”],最大面积为3;
第三层柱状图的高度[“3”,“1”,“3”,“2”,“2”],最大面积为6;
第四层柱状图的高度[“4”,“0”,“0”,“3”,“0”],最大面积为4;