直方图/矩形中的最大矩形

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.For example, given the following matrix:

public class Solution 
{ 
    public int maximalRectangle(char [][]matrix)
    {
        if(matrix==null || matrix.length==0 || matrix[0].length==0) return 0;
        int colLen = matrix[0].length;
        int []height = new int[colLen];
        int []left = new int[colLen];
        int []right = new int[colLen];
        Arrays.fill(right, colLen-1);
        int maxRes = 0;
        for(int i=0; i<matrix.length; i++)
        {
            int curLeft = 0;
            int curRight = colLen-1;
            for(int j=0; j<colLen; j++) height[j] = matrix[i][j]=='1' ? height[j]+1:0;
            for(int j=0; j<colLen; j++)
            {
                if(matrix[i][j] == '1') left[j] = Math.max(left[j], curLeft);
                else
                {
                    curLeft = j+1;
                    left[j] = 0;
                }
            }
            for(int j=colLen-1; j>=0; j--)
            {
                if(matrix[i][j] == '1') right[j] = Math.min(right[j], curRight);
                else
                {
                    curRight = j-1;;
                    right[j] = colLen-1;
                }
            }
            for(int j=0; j<colLen; j++)
            {
                maxRes = Math.max(maxRes, (right[j]-left[j]+1)*height[j]);
            }
        }
        return maxRes;
    }
}
public class Solution 
{
    public int maximalRectangle(char [][]matrix) 
    {
        if(matrix==null || matrix.length==0 || matrix[0].length==0) return 0;
        int []height = new int[matrix[0].length];
        int maxRes = 0;
        for(int i=0; i<matrix.length; i++)
        {
            for(int j=0; j<matrix[0].length; j++)
            {
                height[j] = matrix[i][j]=='1' ? height[j]+1 : 0;
            }
            maxRes = Math.max(maxRes, maxRecHistogram(height));
        }
        return maxRes;
    }	
    // 直方图中最大矩形
    public int maxRecHistogram(int []height)
    {
        Stack<Integer> stack = new Stack<>();
        int maxRes = 0;
        for(int i=0; i<height.length; i++)
        {
            while(!stack.isEmpty() && height[i]<height[stack.peek()])
            {
                int topH = height[stack.pop()];
                int curArea = (i-1 - (stack.isEmpty()? -1:stack.peek())) * topH;
                maxRes = Math.max(maxRes, curArea);
            }
            stack.push(i);
        }
        while(!stack.isEmpty())
        {
            int topH = height[stack.pop()];
            int curArea = (height.length-1- (stack.isEmpty()? -1:stack.peek())) * topH;
            maxRes = Math.max(maxRes, curArea);
        }
        return maxRes;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值