算法学习-动态规划-实战二(leetcode 85)

本文主要是自己对leetcode讨论区的一个解法的理解,记录一下,方便自己复习。

问题描述:Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.

解题思路:首先求出每一个点的高度。然后对于每一个点求以改高度为高,向该点左右延伸的最大矩形。

1、求高:用height(i,j)表示点(i,j)的高度:

            height(i,j) = height(i-1,j) + 1, if matrix[i][j]=='1';

            height(i,j) = 0, if matrix[i][j]=='0'

     如对于:

          

   得到:

         

2、求最左边界和最右边界:求出每一个点的高后,对于点(i,j)首先考虑以height(i,j)为高的矩形的最左边界left(i,j),这个最左边界由两个东西决定,上一个点的最左边界和(i,j)点所在行中改能够到达的最左边界(currLeft)。

        最左边界不能超过上一点的最左边界和本行的最左边界;

for(int j=0;j<n;j++){
    if(matrix[i][j] == '1'){
	 left[j] = max(left[j],currLeft);
    }else{
	 left[j]=0;
	 currLeft = j+1;
    }
}

    

      相同的原理,左右边界为:

for(int j=n-1;j>=0;j--){
     if(matrix[i][j] == '1'){
	   right[j] = min(right[j],currRight);
     }else{
	   right[j]=n;
	   currRight = j;
     }
}

    

3、求最大面积:最后根据最右边界和最左边界求出宽,再根据已求得的高得出面积。遍历,求出最大面积。

     

    注意:对于(i,j)点,Area(i,j)并不是以(i,j)为右下角的最大矩形,如左边一个红色的点,显然以其为右下角的最大矩形面积是3而不是6。Area(i,j)表示的是以height(i,j)为高,向(i,j)左右延伸的最大矩形面积。图中彩色框对于的就是相应颜色点的最大矩形。

完整代码:

class Solution {
public:
 
    int maximalRectangle(vector<vector<char> > &matrix) {
         if(matrix.empty()) return 0;
	    const int m = matrix.size();
	    const int n = matrix[0].size();
	    int left[n], right[n], height[n];
	    fill_n(left,n,0); fill_n(right,n,n); fill_n(height,n,0);
	    int maxA = 0;
	    for(int i=0; i<m; i++) {
	    	int currLeft=0;
	    	int currRight = n;
	    	for(int j=0; j<n;j++){
	    		if(matrix[i][j] == '1'){
	    			height[j] += 1;
	    		}else{
	    			height[j] = 0;
	    		}
	    	}
	    	for(int j=0;j<n;j++){
	    		if(matrix[i][j] == '1'){
	    			left[j] = max(left[j],currLeft);
	    		}else{
	    			left[j]=0;
	    			currLeft = j+1;
	    		}
	    	}
	    	for(int j=n-1;j>=0;j--){
	    		if(matrix[i][j] == '1'){
	    			right[j] = min(right[j],currRight);
	    		}else{
	    			right[j]=n;
	    			currRight = j;
	    		}
	    	}
	    	for(int j=0;j<n;j++){
	    		maxA = max(maxA,height[j]*(right[j]-left[j]));
	    	}
	    }
	    return maxA;

    }
};

此题还有另 一种用堆栈的解法:思想要好理解一些。



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值