LeetCode - Maximal Rectangle ***

时间复杂度O(M*N),空间复杂度O(N)。

核心思想是:如果存在这样一个最大矩形,那这个矩形可以看成由一列由1组成的线段从左向右扫过所得。

遍历所有这样的线段,即可得到最大的矩形。

下面这段代码是leetcode讨论区上这题最简洁最酷的一段代码。

其中每次H[j],L[j],R[j]分别残留了上一行中该列的线段长度,左边1的位置和右边0(用0是为了方便计算面积)的位置。


注意一些细节,如果为0,则H[j]清零,L[j]和R[j]也必须要初始化为0和n。

计算R[j]的时候顺便把面积给更新了。

class Solution {
public:
    int maximalRectangle(vector<vector<char> > &matrix){
		if(matrix.size()==0)
			return 0;
		int n = matrix[0].size();
		vector<int> H(n);
		vector<int> L(n);
		vector<int> R(n,n);
		int res = 0;
		for(int i=0;i<matrix.size();++i){
			int left = 0, right = n;
			for(int j=0;j<n;++j){
				if(matrix[i][j]=='1'){
					++H[j];
					L[j] = max(left,L[j]);
				}
				else{
					H[j] = 0; left = j+1; L[j] = 0; R[j] = n;
				}
			}
			for(int j=n-1;j>=0;--j){
				if(matrix[i][j]=='1'){
					R[j] = min(R[j],right);
					res = max(res, (R[j]-L[j])*H[j]);
				}
				else{
					right = j;
				}
			}
		}
		return res;

	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值