[LeedCode OJ]#85 Maximal Rectangle

【声明:版权所有,转载请标明出处,请勿用于商业用途。联系信箱:libin493073668@sina.com】

题目链接:https://leetcode.com/problems/maximal-rectangle/

题意:

给出一个只包含0,1的二维矩阵,要求找到一个全为1的子矩阵,并输出子矩阵的面积

思路:

首先我们对这个矩阵进行求和

dp[i][j]表示以(1,1)为左上角,(i,j)为右下角的子矩阵的1的个数

现在我们要统计蓝色矩形的面积,假设右下角的坐标是(i,j)

此时蓝色矩形的宽与长分别是r,c

那么我们只需要判断蓝色矩形内的1的个数是否与r*c相等,就可以知道这个矩形是否是全1子矩阵

那么怎么统计呢?

我们可以知道dp[i][j]是(1,1)到(i,j)的1的总个数

假设绿色矩阵的左上角是(0,0)

那么绿色矩阵的面积dp[i-r][j-c]

两个红色矩阵的面积分别是dp[i][j-c],dp[i-r][j]

那么统计蓝色矩阵1的个数的式子便是dp[i][j]-dp[i][j-c]-dp[i-r][j]+dp[i-r][j-c]

然后我们只需要以每个1为右下角,去增大r,c便可

class Solution{public:int maximalRectangle(vector<vector<char> >& matrix){int n = matrix.size();if(n==0) return 0;int m = matrix[0].size();int i,j,c;vector<vector<int> > dp,a;dp.resize(n+1),a.resize(n+1);for(i = 0; i<=n; i++){dp[i].resize(m+1);a[i].resize(m+1);}for(i = 0; i<n; i++){for(j = 0; j<m; j++){a[i+1][j+1] = matrix[i][j]-'0';}}int sum = 0;//计算1的个数for(i = 1; i<=m; i++){sum+=a[1][i];dp[1][i] = sum;}for(i = 2; i<=n; i++){sum = 0;for(j = 1; j<=m; j++){sum+=a[i][j];dp[i][j]=dp[i-1][j]+sum;}}//以每个1为右下角,寻找最大全1子矩阵int maxn = 0;for(i = n; i>0; i–){for(j = m; j>0&&maxn<i*j; j–){if(a[i][j]){int r = 1,c = 1;while(j-c>=0){if(dp[i][j]-dp[i][j-c]-dp[i-r][j]+dp[i-r][j-c]==r*c)//是全1矩阵,继续增大列{maxn = max(maxn,r*c);c++;}elsebreak;}while(i-r>=0&&c>0){if(dp[i][j]-dp[i][j-c]-dp[i-r][j]+dp[i-r][j-c]==r*c)//是全1矩阵,继续增大行{maxn = max(maxn,r*c);r++;}else//否则,减少一列再去重复判断c–;}}}}return maxn;}};

版权声明:本文为博主原创文章,,如果转载,请注明出处

曾经拥有的不要忘记,难以得到的更要珍惜,

[LeedCode OJ]#85 Maximal Rectangle

相关文章:

你感兴趣的文章:

标签云: