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     }

 

你可能感兴趣的:(LeetCode)