Maximal Rectangle

29 篇文章 0 订阅

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

 

 

 

class Solution {
public:

	vector<vector<int> > lreach,upreach,rreach;

	void set_reach(vector<vector<char> > &matrix)
	{
		
		vector<int> v;
		for(int r = 0; r < matrix.size(); ++r)
		{
			if(matrix[r][0] == '1')v.push_back(1);
			else v.push_back(0);

			for(int c = 1; c < matrix[r].size(); ++c)
			{
				if(matrix[r][c] == '0')v.push_back(0);
				if(matrix[r][c] == '1' && matrix[r][c - 1] == '1')v.push_back(v[c - 1] + 1);
				if(matrix[r][c] == '1' && matrix[r][c - 1] == '0')v.push_back(1);

			}
			lreach.push_back(v);
			v.clear();
		 }
		

		for(int r = 0; r < matrix.size(); ++r)
		{
			vector<int> v;
			int rsize = matrix[0].size();
			if(matrix[r][rsize - 1] == '1')v.push_back(1);
			else v.push_back(0);

			for(int c = rsize - 2; c >= 0; --c)
			{
				if(matrix[r][c] == '0')v.push_back(0);
				if(matrix[r][c] == '1' && matrix[r][c + 1] == '1')v.push_back(v[v.size() - 1] + 1);
				if(matrix[r][c] == '1' && matrix[r][c + 1] == '0')v.push_back(1);

			}
			reverse(v.begin(), v.end());
			rreach.push_back(v);
			v.clear();
		}


		for(int c = 0; c < matrix[0].size(); ++c)
		{
			if(matrix[0][c] == '1')v.push_back(1);
			else v.push_back(0);

			for(int r = 1; r < matrix.size(); ++r)
			{
				if(matrix[r][c] == '0')v.push_back(0);
				if(matrix[r][c] == '1' && matrix[r - 1][c] == '1')v.push_back(v[r - 1] + 1);
				if(matrix[r][c] == '1' && matrix[r - 1][c] == '0') v.push_back(1);
			}

			upreach.push_back(v);
			v.clear();
		}

	}

    int maximalRectangle(vector<vector<char> > &matrix) {
		if(!matrix.size())return 0;
		set_reach(matrix);
		
		int rtv = 0;
		int l,rt,up;
		for(int r = 0; r < matrix.size(); ++r)
		{
			
			for(int c = 0; c < matrix[r].size(); ++c)
			{
				up = upreach[c][r];
				
				if(!up)l = rt= 0;
				else
				{
					l =  lreach[r][c];
					rt =  rreach[r][c];

					for(int i = 1; i <= up ; ++i)
					{
						l = min(l, lreach[r - i + 1][c]);
						rt = min(rt, rreach[r - i + 1][c]);
					}

					
				}

				rtv = max(rtv, up * (l + rt - 1));
			}

			
		}

        return rtv;
    }
};


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值