逐层遍历,计算一个height数组表示目前的高度值然后在这个数组上计算最大矩形的面积。计算的时候利用DP的方法来寻找某一点向左和向右所能达到的最远距离,也就是从这个最远距离到我们这个点可以形成一个递减的序列,比如说我们已经要计算i所能到达的最左距离,我们先比较i-1和i高度的大小,如果i-1不低于i,那么i-1最左能到达的地方i也能到达,设这个地方为k,那么我们继续比较k-1和i的高度,如此继续直到条件不能再满足。这一点上的面积就是(R - L + 1)*height。时间复杂度为O(n)。整体的复杂度为O(mn)。
public class Solution { public int maximalRectangle(char[][] matrix) { int m = matrix.length; if(m == 0) return 0; int n = matrix[0].length; if(n == 0) return 0; int[] height = new int[n]; for(int i = 0; i < n; i++) height[i] = 0; int result = Integer.MIN_VALUE; for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { if(matrix[i][j] == '1') height[j]++; else height[j] = 0; } result = Math.max(result, Rectangle(height)); } return result; } private int Rectangle(int[] height) { int n = height.length; int[] left = new int[n]; int[] right = new int[n]; left[0] = 0; for(int i = 1; i < n; i++) { int ind = i; while(ind > 0 && height[ind-1] >= height[i]) ind = left[ind-1]; left[i] = ind; } right[n-1] = n-1; for(int i = n-2; i >= 0; i--) { int ind = i; while(ind < n-1 && height[ind+1] >= height[i]) ind = right[ind+1]; right[i] = ind; } int ma = Integer.MIN_VALUE; for(int i = 0; i < n; i++) { ma = Math.max(ma, height[i]*(right[i] - left[i] + 1)); } return ma; } }
没有评论:
发表评论