LeetCode_OJ【85】 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.

这题需要借用84题的解题思路,使用stack,不过即使知道这点,也不是那么容易就知道怎么做。

在翻了好几份答案之后看到了一个讲解的还不错的博客:http://blog.csdn.net/jiyanfeng1/article/details/8068676

题目标签里面有DP   在这个思路中构造表示每列柱状高度的二维数组的过程就用到了DP,其实也可以简化为只使用一个一维数组,没遍历一行更新一次该数组,同时运用84题思路就可以解出在该行之下的最大子矩阵。

下面是我的JAVA实现,stack使用的jdk自带的stack,在提交的答案中性能一般,使用数组可以继续优化。

public class Solution {
    public int maximalRectangle(char[][] matrix) {
		if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
			return 0;
        int height[] = new int[matrix[0].length+ 1];
        for(int i = 0 ; i < matrix[0].length+ 1 ; i ++)
        	height[i] = 0;
        Stack<Integer> stack = new Stack<Integer>();
        int res = 0;
        for(int i = 0 ; i < matrix.length ; i ++){
        	for(int j = 0 ; j < matrix[0].length ; j ++){
        		if(matrix[i][j] == '1') 
        			height[j] ++;
        		else 
        			height[j] = 0;
        	}
        	if(!stack.empty())
        		stack.clear();
        	for(int j = 0 ; j <= matrix[0].length ; j ++){
        		while( !stack.empty() && height[j] < height[stack.peek()] ){
        			int tmp = height[stack.pop()];
        			int len = stack.empty() ? j : j -stack.peek() -1;
        			res = Math.max(len*tmp, res);
        		}
        		stack.push(j);
        	}
        }
        return res;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值