leetcode--85. Maximal Rectangle

来源:互联网 发布:企业网络拓扑图配置 编辑:程序博客网 时间:2024/06/12 22:24

85. Maximal Rectangle

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:

1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0
Return 6.

/*
给定一个矩阵中,只有0和1,求出这个矩阵的一个最大的子矩阵,其中只包含1.例如:
01101
11010
01110
11110     -->行
11111
00000


其实这个问题可以转化为Largest Rectangle in Histogram,先将上面的矩阵转化为:
行                     列: 
01101                  01201
12010                  12010    
03110                  01230
14210                  12340
25321                  12345
00000                  00000    
然后对每一列求直方图的最大面积。


题解:
这道题可以应用之前解过的Largetst Rectangle in Histogram一题辅助解决。
解决方法是:按照每一行计算列中有1的个数,作为高度,当遇见0时,这一列高度就为0。
            然后对每一行计算 Largetst Rectangle in Histogram,最后得到的就是结果。
*/
public class Solution {
    public int maximalRectangle(char[][] matrix) {
        if(matrix==null || matrix.length==0 || matrix[0].length==0)
             return 0;
         int m = matrix.length;
         int n = matrix[0].length;
         int max = 0;
         int[] height = new int[n];//对每一列构造数组
         for(int i=0;i<m;i++){
             for(int j=0;j<n;j++){
                 if(matrix[i][j] == '0')//如果遇见0,这一列的高度就为0了
                    height[j] = 0;
                 else
                     height[j] += 1;
            }
            max = Math.max(largestRectangleArea(height),max);
        }
        return max;
    }
     
     public int largestRectangleArea(int[] height) {
         Stack<Integer> stack = new Stack<Integer>();
         int i = 0; 
         int maxArea = 0;
        // int[] h = new int[height.length + 1];
         //h = Arrays.copyOf(height, height.length + 1);//方法复制指定的数组,截取或用null填充(如有必要),以使副本具有指定的长度
          int n = height.length;                                           //height -- 这是要被复制的数组;heigh.tlength+1这是要返回的副本长度
         while(i <= n){
             int temp = (i == n ? 0 : height[i]);
             if(stack.isEmpty() || height[stack.peek()] <= temp){
                 stack.push(i);
                 i++;
             }else {
                 int t = stack.pop();
                 int square = -1;
                 if(stack.isEmpty())
                    square = height[t]*i;
                 else{
                    int x = i-stack.peek()-1;
                    square = height[t]*x;
                }
                 maxArea = Math.max(maxArea, square);
            }
         }
        return maxArea;
    }
}

0 0