首页 > 代码库 > Maximal Rectangle leetcode java

Maximal Rectangle leetcode java

题目:

Given a 2D binary matrix filled with 0‘s and 1‘s, find the largest rectangle containing all ones and return its area.

 

题解:

 这道题可以应用之前解过的Largetst Rectangle in Histogram一题辅助解决。解决方法是:

按照每一行计算列中有1的个数,作为高度,当遇见0时,这一列高度就为0。然后对每一行计算 Largetst Rectangle in Histogram,最后得到的就是结果。

 

代码如下:

 1 public int maximalRectangle(char[][] matrix) {
 2         if(matrix==null || matrix.length==0 || matrix[0].length==0)
 3             return 0;
 4         int m = matrix.length;
 5         int n = matrix[0].length;
 6         int max = 0;
 7         int[] height = new int[n];//对每一列构造数组
 8         for(int i=0;i<m;i++){
 9             for(int j=0;j<n;j++){
10                 if(matrix[i][j] == ‘0‘)//如果遇见0,这一列的高度就为0了
11                     height[j] = 0;
12                 else
13                     height[j] += 1;
14             }
15             max = Math.max(largestRectangleArea(height),max);
16         }
17         return max;
18     }
19     
20     public int largestRectangleArea(int[] height) {
21         Stack<Integer> stack = new Stack<Integer>();
22         int i = 0;
23         int maxArea = 0;
24         int[] h = new int[height.length + 1];
25         h = Arrays.copyOf(height, height.length + 1);
26         while(i < h.length){
27             if(stack.isEmpty() || h[stack.peek()] <= h[i]){
28                 stack.push(i);
29                 i++;
30             }else {
31                 int t = stack.pop();
32                 int square = -1;
33                 if(stack.isEmpty())
34                     square = h[t]*i;
35                 else{
36                     int x = i-stack.peek()-1;
37                     square = h[t]*x;
38                 }
39                 maxArea = Math.max(maxArea, square);
40             }
41         }
42         return maxArea;
43     }