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 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

Return 6.

算法分析:

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

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

public class MaximalRectangle
{

	public int maximalRectangle(char[][] matrix) 
	{
		if(matrix.length == 0 || matrix[0].length == 0 || matrix == null)
		{
			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')
				{
					height[j] = 0;
				}
				else
				{
					height[j] += 1;
				}
			}
			max = Math.max(max, largestRectangleArea2(height));
		}
		return max;
    }
	public  int largestRectangleArea2(int[] heights)
	{
		Stack<Integer> stack = new Stack<>();
		int[] h = Arrays.copyOf(heights, heights.length + 1);//h最后元素补0,为了让所有元素出栈,所以补0
		int i = 0;
		int maxArea = 0;
		while(i < h.length)
		{
			if(stack.isEmpty() || h[stack.peek()] <= h[i])
			{
				stack.push(i++);//只存放单调递增的索引
			}
			else
			{
				int t = stack.pop();//stack.isEmpty说明i是栈里最小的元素,面积为i*h[t]
				maxArea = Math.max(maxArea, h[t]*(stack.isEmpty() ? i : i-stack.peek()-1));
			}
		}
		return maxArea;
	}
}

 

posted @ 2016-08-24 17:12  32ddd  阅读(356)  评论(0编辑  收藏  举报