leetcode-Maximal Rectangle
来源:互联网 发布:国内餐饮软件排名 编辑:程序博客网 时间:2024/04/30 12:02
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
题意:给出一个矩形,里面填充'0'和'1',找出完全由'1'组成的最大子矩形的面积。
分析:我是用dp做这道题的。用row[i][j]和col[i][j]分别记录以点(i,j)为右下角的全1子矩形的行数和列数。用right[i][j]和down[i][j]记录以(i,j)为结尾的从左到右连续1个数、从上到下连续1个数。
依次遍历每个点(i,j),考虑点(i-1,j)和(i,j-1)。
对于点(i-1,j),考虑(row[i-1][j]+1)*col[i-1][j]是否小于单行连续1个数right[i][j],若小于,记录以(i,j)为右下角的最大矩形为这个单行连1;否则,记录为(i-1,j)对应矩形加当前行,列数为min(col[i-1][j],right[i][j])。
对于点(i-1,j),考虑row[i][j-1]*(col[i][j-1]+1)是否小于单列连续1个数down[i][j],若小于,记录以(i,j)为右下角的最大矩形为这个单列连1;否则,记录为(i,j-1)对应矩形加当前列,行数为min(row[i][j-1],down[i][j])。
选上述两个结果的较大矩形,作为(i,j)的结果。
记录所有点中的最大矩形面积,即为结果。
代码:
class Solution {public: int maximalRectangle(vector<vector<char> > &matrix) { int n = matrix.size(); if(n==0) return 0; int m = matrix[0].size(); if(m==0) return 0; int **row = new int*[n+1]; int **col = new int*[n+1]; int **right = new int*[n+1]; int **down = new int*[n+1]; for(int i=0; i<=n; i++) { row[i] = new int[m+1]; col[i] = new int[m+1]; right[i] = new int[m+1]; down[i] = new int[m+1]; memset(row[i],0,sizeof(int)*(m+1)); memset(col[i],0,sizeof(int)*(m+1)); memset(right[i],0,sizeof(int)*(m+1)); memset(down[i],0,sizeof(int)*(m+1)); } for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(matrix[i][j]=='0') right[i+1][j+1]=0; else right[i+1][j+1]=right[i+1][j]+1; } } for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { if(matrix[j][i]=='0') down[j+1][i+1]=0; else down[j+1][i+1]=down[j][i+1]+1; } } int ans = 0; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(matrix[i-1][j-1]=='1') { row[i][j]=1; col[i][j]=1; int r1,c1,r2,c2; if(right[i][j]>(row[i-1][j]+1)*col[i-1][j]) { r1 = 1; c1 = right[i][j]; } else { r1 = row[i-1][j]+1; c1 = min(col[i-1][j],right[i][j]); } if(down[i][j]>row[i][j-1]*(col[i][j-1]+1)) { r2 = down[i][j]; c2 = 1; } else { r2 = min(row[i][j-1],down[i][j]); c2 = col[i][j-1]+1; } if(r1*c1>r2*c2) { row[i][j] = r1; col[i][j] = c1; } else { row[i][j] = r2; col[i][j] = c2; } if(row[i][j]*col[i][j]>ans) ans = row[i][j]*col[i][j]; } } } return ans; }};
0 0
- 【LeetCode】Maximal Rectangle && Maximal Square
- Leetcode:Maximal Square & Maximal Rectangle
- LeetCode: Maximal Rectangle
- LeetCode Maximal Rectangle
- LeetCode: Maximal Rectangle
- [LeetCode] Maximal Rectangle
- [leetcode] Maximal Rectangle
- [LeetCode]Maximal Rectangle
- [leetcode]Maximal Rectangle
- LeetCode-Maximal Rectangle
- [leetcode] Maximal Rectangle
- Leetcode Maximal Rectangle
- [LeetCode] Maximal Rectangle
- leetcode Maximal Rectangle
- LeetCode Maximal Rectangle
- LeetCode | Maximal Rectangle
- [LeetCode] Maximal Rectangle
- [Leetcode] Maximal Rectangle (Java)
- hdu 3535 AreYouBusy dp
- 一个支持大数计算的类型 仅不支持除法
- emacs浏览器配置
- 插入排序
- 【OpenGL】Shader实例分析(五)- 边缘检测
- leetcode-Maximal Rectangle
- 我们仨
- 第四周作业——无向图的DFS算法
- 二分查找
- 从原理出发理解JDK动态代理
- 构建RESTful Web Service - 验证的实现和使用(HTTP 基本认证)
- web开发小技巧:异类的Javascript处理和解析URL的方式
- 个人编程总结细节
- 第四周java作业,图的表示