问题
例子
思路
highs长度为matrix.[0].length
存储的是该行中每一个元素从第一行对应的相应元素到该行此位置连续的1的个数【该元素一定要是1】
-
方法1
-
方法2
代码
//方法1
class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix.length==0) return 0;
int m = matrix.length, n = matrix[0].length;
int[] highs = new int[n];
int res = 0;
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(matrix[i][j]=='0') highs[j]=0;
else highs[j]+=1;
}
res = Math.max(res, get(highs));
}
return res;
}
public int get(int[] highs) {
int len = highs.length;
List<Integer> list = new ArrayList<>();
list.add(0);
for(int n : highs) list.add(n);
list.add(0);
Stack<Integer> s = new Stack<>();
int res = 0;
for(int i=0; i<list.size(); i++) {
//找到两个边界
while(s.size()>0 && list.get(i)<list.get(s.peek())) {
int temp = s.pop();
int left = s.peek()+1;
res = Math.max(res, (i-1-left+1)*list.get(temp));
}
//每个下标都要进栈,因为从栈出来时才以该列为高才进行计算
s.push(i);
}
return res;
}
}
//方法2