let 85 Maximal Rectangle

主题思想: 这题是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;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值