題目:
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 }
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 }