单调栈
class Solution {
public int maximalRectangle(char[][] matrix) {
//单调栈 结合第84题!
int row = matrix.length, col = 0;
if(row > 0)
col = matrix[0].length;
int[][] dp = new int[row][col];
//dp[i][j]记录第j列从上到下以第i个元素结尾的连续1的个数
for(int j = 0;j < col;j++){
dp[0][j] = matrix[0][j] == '1' ? 1:0;
}
for(int j = 0;j < col;j++){
for(int i = 1;i < row;i++){
dp[i][j] = matrix[i][j] == '1' ? dp[i-1][j]+1 : 0;
}
}
int area = 0;
for(int i = 0;i < row;i++)
area = Math.max(area, largestRectangleArea(dp[i]));
return area;
}
//第84题!
public int largestRectangleArea(int[] heights){
int len = heights.length, area = 0;
//添加哨兵
int[] newHeight = new int[len+2];
for(int i = 0;i < len;i++){
newHeight[i+1] = heights[i];
}
newHeight[0] = 0;newHeight[len+1] = 0;
len += 2;
//单调栈
Deque<Integer> st = new LinkedList<>();
st.push(0);
for(int i = 1;i < len;i++){
while(newHeight[st.peek()] > newHeight[i]){
int height = newHeight[st.pop()];
int width = i - st.peek() - 1;
area = Math.max(area, height*width);
}
st.push(i);
}
return area;
}
//暴力法
// int row = matrix.length, col = 0;
// if(row > 0)
// col = matrix[0].length;
// int[][] dp = new int[row][col];//dp[i][j]记录第i行以第j个元素结尾的连续1的个数
// for(int i = 0;i < row;i++){
// dp[i][0] = matrix[i][0] == '1' ? 1:0;
// }
// for(int i = 0;i < row;i++){
// for(int j = 1;j < col;j++){
// dp[i][j] = matrix[i][j] == '1' ? dp[i][j-1]+1 : 0;
// }
// }
// int area = 0;
// for(int j = 0;j < col;j++){
// for(int i = 0;i < row;i++){//每次以dp[i][j]为宽上下拓展矩形并记录面积
// if(dp[i][j] == 0) continue;
// int width = dp[i][j], height = 1;
// int up = i - 1, down = i + 1;
// while(up >= 0 && dp[up--][j] >= width){
// height++;
// }
// while(down < row && dp[down++][j] >= width){
// height++;
// }
// area = Math.max(area, width * height);
// }
// }
// return area;
// }
}