主题思想: 这题是84的升级版,之所以记录这道题是因为,解决这道题的思想,值得学习。可以作为解决类似问题的通用思想。
这是二维的,84是一维的, 那么把二维化成1维就实现了降维,这种思想和求最大子序列和,以及求矩阵中最大子序列和是一样的。
或者说这道题本身,就和求最大子序列和是类似的题。解法类似。
这种思想值得注意,就是解二维题是,通过把数据累加的方式,转化成1维问题,
第一行加上第二行,加上第三行,…. 这种思想要记得 ,还有就是具体问题,具体分析,比如这道题,就不是单纯的累加关系了,而是如果是1 ,加1 ,是0 ,就置为0,
AC 代码
class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix==null||matrix.length==0) return 0;
int n=matrix[0].length;
int [] heights=new int [n];
for(int i=0;i<n;i++){
if(matrix[0][i]=='1')heights[i]=1;
else heights[i]=0;
}
int mx;
mx=getMaxHistorgram(heights);
int tmp=0;
int tmpMx=0;
for(int i=1;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
if(matrix[i][j]=='1')
heights[j]+=1;
else
heights[j]=0;
}
mx=Math.max(mx,getMaxHistorgram(heights));
}
return mx;
}
public int getMaxHistorgram(int [] heights){
if(heights==null) return 0;
int n=heights.length;
// need add a end flag so ,i can be equal to n
int tmp=0;
int mx=0;
Deque<Integer> stack=new ArrayDeque<Integer>();
for(int i=0;i<=n;i++){
tmp=(i==n?0:heights[i]);
if(stack.isEmpty()||tmp>=heights[stack.peekFirst()]){
stack.push(i);
}else{
tmp=stack.pop();
mx=Math.max(mx,heights[tmp]*(stack.isEmpty()?i:i-stack.peekFirst()-1));
i--; //important
}
}
return mx;
}
}