[LeedCode OJ]#85 Maximal Rectangle
来源:互联网 发布:snmp简单网络管理协议 编辑:程序博客网 时间:2024/06/05 10:50
【 声明:版权所有,转载请标明出处,请勿用于商业用途。 联系信箱: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++; } else break; } 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; }};
0 0
- [LeedCode OJ]#85 Maximal Rectangle
- [LeedCode OJ]#221 Maximal Square
- LeetCode OJ:Maximal Rectangle
- LeetCode OJ - Maximal Rectangle
- LeetCode OJ Maximal Rectangle
- [LeedCode OJ]#223 Rectangle Area
- LeetCode(85) Maximal Rectangle
- leetcode || 85、Maximal Rectangle
- leetcode 85:Maximal Rectangle
- leetcode 85: Maximal Rectangle
- LeetCode_OJ【85】 Maximal Rectangle
- LeetCode(85) Maximal Rectangle
- Leetcode (85) Maximal Rectangle
- leetcode 85: Maximal Rectangle
- LeetCode 85 Maximal Rectangle
- [Leetcode] #85 Maximal Rectangle
- [Leetcode 85] Maximal Rectangle
- [leetcode 85] Maximal Rectangle 待续
- win+ubuntu双系统安装后无法进入win7解决方法
- 从视频文件提取音频并存储为MP3格式文件
- xpath提取多个标签下的text
- Ubuntu 12.10安装交叉编译器arm-none-linux-gnueabi-gcc
- Android 图片缓存处理
- [LeedCode OJ]#85 Maximal Rectangle
- 更新至OSX 10.10后MBA外接网卡无法使用的解决
- javascript的对象
- 排序算法(三)选择排序
- PCM转MP3音频文件(借助lame库)
- 深入理解Java内存模型之系列篇
- JDBC DAO
- js算法:分治法-快速排序
- zz: Python subprocess创建子进程(Windows下打开新的CMD窗口)