LeetCode--85. Maximal Rectangle

解法一:种子点扩展

class Solution {
    
    public static int maxArea;
    public static int N_ROW;
    public static int N_COL;
    
    
    public int maximalRectangle(char[][] matrix) {
    
        N_ROW=matrix.length;
        if(matrix==null || N_ROW==0)
            return 0;
        N_COL=matrix[0].length;
        maxArea=0;
        
        for(int i=0;i<N_ROW;i++)
        {
            for(int j=0;j<N_COL;j++)
            {
                if(matrix[i][j]=='1')
                {
                    maxArea=Math.max(maxArea,1);
                    expand(i,j,1,1,matrix);
                }
            }
        }
        return maxArea;
    }
        
        
        public static void expand(int i,int j,int width,int height,char[][] matrix)
        {
            if(j+width<N_COL)
            {
                for(int dh=0;dh<height;dh++)
                {
                    if(matrix[i+dh][j+width]=='0')
                    {
                        break;
                    }
                    if(dh==height-1)
                    {
                        maxArea=Math.max(maxArea,(1+width)*height);
                        expand(i,j,width+1,height,matrix);
                    }
                        
                }
            }
            
            if(i+height<N_ROW)
            {
                for(int dw=0;dw<width;dw++)
                {
                    if(matrix[i+height][j+dw]=='0')
                        break;
                    if(dw==width-1)
                    {
                        maxArea=Math.max(maxArea,(1+height)*width);
                        expand(i,j,width,height+1,matrix);
                    }
                }
            }
        }
}

解法二:转为直方图最大矩形问题

class Solution {
    
    public static int maxArea;
    public static int N_ROW;
    public static int N_COL;
    
    
    public int maximalRectangle(char[][] matrix) {
    
        N_ROW=matrix.length;
        if(matrix==null || N_ROW==0)
            return 0;
        N_COL=matrix[0].length;
        maxArea=0;
        
        int[] heights=new int[N_COL];
        for(int i=0;i<N_ROW;i++)
        {
            for(int j=0;j<N_COL;j++)
            {
                heights[j]=matrix[i][j]=='0'?0:heights[j]+1;
            }
            
            maxArea=Math.max(maxArea,largestRectangleArea(heights));
        }
        return maxArea;
    }
    
    public int largestRectangleArea(int[] heights) {
        
        Stack<Integer> stack=new Stack<>();
        int maxArea=0,n=heights.length;
        for(int i=0;i<=n;i++)
        {
            while(!stack.isEmpty() && (i==n || heights[stack.peek()]>heights[i]) )
            {
                
                int index=stack.pop();
                int h=heights[index];
                int w=stack.isEmpty()?i:i-stack.peek()-1;
                maxArea=Math.max(maxArea,h*w);
            }
            stack.push(i);
        }
        return maxArea;
    }
}

解法三:

class Solution {
    public static int maxArea;
    public static int N_ROW;
    public static int N_COL;
    
    
    public int maximalRectangle(char[][] matrix) {
    
        N_ROW=matrix.length;
        if(matrix==null || N_ROW==0)
            return 0;
        N_COL=matrix[0].length;
        maxArea=0;
        for(int i=0;i<N_ROW;i++)
        {
            for(int j=0;j<N_COL-1;j++)
            {
                matrix[i][j+1] =  matrix[i][j+1]=='1'?(char)(matrix[i][j]+1):'0';
            }
        }
        for(int i=0;i<N_ROW;i++)
        {
            for(int j=0;j<N_COL;j++)
            {
                if(matrix[i][j]!='0')
                {
                    int minSequence=matrix[i][j]-'0';
                    for(int k=i;k>=0;k--)
                    {
                        minSequence=Math.min(minSequence,matrix[k][j]-'0');
                        maxArea=Math.max(maxArea,minSequence*(i-k+1));
                    }
                }
                
            }
        }
        return maxArea;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值