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;
    }
}

猜你喜欢

转载自blog.csdn.net/To_be_to_thought/article/details/89034601