Solution: 84题 找直方图中的最大矩形的变型
相似问题还有221题
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
查找最大矩形,所以它一定是以某一行元素为底边的,将要找到的某个矩形就转换成 以某一个行为底边的最大矩形Histogram问题。
原始矩形可以变成如下的形式的数据:
0 1 0 1 0 0
0 2 1 0 0 1
1 3 2 0 1 0
0 0 0 0 0 1
Largest Rectangle in Histogram问题
class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix.length==0) return 0;
int res = 0;
int row = matrix.length;
int col = matrix[0].length;
//将matrix转换为 以每一行为底边的直方图长方形问题
//第一行不作处理
for(int i=1;i<row;i++){
for(int j=0;j<col;j++){
if(matrix[i][j] !='0'){
matrix[i][j] = (char)(matrix[i-1][j]+1);
}
}
}
for(int i=0;i<row;i++){
//每一行是一次直方图矩形问题
res = Math.max(res, largestRectangleArea(matrix[i]));
}
return res;
}
//借助85题的单调栈方法
public int largestRectangleArea(char[] matrix) {
int[] heights = new int[matrix.length];
for(int i=0;i<heights.length;i++){
heights[i] = matrix[i]-'0';
}
int res = 0;
int len = heights.length;
Stack<Integer> stack = new Stack<Integer>();
for(int i=0;i<=len;i++){
int right = (i==len)?0:heights[i];
while(!stack.isEmpty()&&right<heights[stack.peek()]){
int height = heights[stack.pop()];
res = Math.max(res, height*((stack.isEmpty()?i:(i-1-stack.peek()))));
}
stack.push(i);
}
return res;
}
}