leetcode085_221:Maximal Rectangle&Maximal Square
2015-06-30 11:41
501 查看
题目描述
Maximal Rectangle:Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing all ones and return its area.
Maximal Square
Given a 2D binary matrix filled with 0’s and 1’s, find the largest square containing all 1’s and return its area.
问题分析
要求01矩阵中由1组成的最大矩阵的面积。这类题目可以通过记录每个点的向左延伸长度和向上延伸高度来求出每个点作为矩阵右下顶点时的最大矩阵面积。显然对于点为0的点面积为0.所以只对点为1的点进行考虑。现在问题就变为怎么求以该点为矩阵右下顶点时的最大矩阵面积,而对于Maximal Square即求以该点为矩阵右下顶点时的最大正方形面积。在给定每个点的向上高度如何求最大边长呢?看图:
红色代表将要求最大面积的点。对于Maximal Rectangle,从右往左尝试,每次记录下当前能组成最大矩阵时的高度值的索引,遍历结束时可以找到答案;对于Maximal Square,从左往右,初始边长为该红点向左的最长宽度,如果发现高度小于边长,需要更新当前边长,否则保持不变,最后得到的边长平方就是答案。
附代码:
//Maximal Rectangle:20ms int wid[1000][1000]; int hei[1000][1000]; int area1[1000][1000]; class Solution { public: int maxArea(int l,int r, int row) { int ans = 0; int cur = r; for (int k = r; k >= l+1; k--) { if (hei[row][k - 1] >= hei[row][cur]) continue; else { ans = max(ans, hei[row][cur]*(r - k + 1)); cur = k - 1; } } ans = max(ans, hei[row][cur] * (r - l + 1)); return ans; } int maximalRectangle(vector<vector<char>>& matrix) { int ans = 0; int m = matrix.size(); if (!m) return ans; int n = matrix[0].size(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (matrix[i][j] == '0') { wid[i][j] = hei[i][j] = 0; } else { int area = 0; if (!i&&!j) { wid[i][j] = hei[i][j] = 1; area = 1; } else if (!i) { wid[i][j] = wid[i][j - 1] + 1; hei[i][j] = 1; area = wid[i][j]; } else if(!j) { wid[i][j] = 1; hei[i][j] = hei[i - 1][j] + 1; area = hei[i][j]; } else { wid[i][j] = 1 + wid[i][j - 1]; hei[i][j] = 1 + hei[i - 1][j]; area = max(area, maxArea(j - wid[i][j] + 1, j, i)); } ans = max(area, ans); area1[i][j] = area; } } } return ans; } }; //Maximal Square:16ms int wid[1000][1000]; int hei[1000][1000]; int area1[1000][1000]; class Solution { public: int maxArea(int l, int r, int row) { int side = r - l + 1; for (int i = l; i <= r; i++) { if (hei[row][i] >= side) { continue; } else { side = r - i; } } return side*side; } int maximalSquare(vector<vector<char>>& matrix) { int ans = 0; int m = matrix.size(); if (!m) return ans; int n = matrix[0].size(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (matrix[i][j] == '0') { wid[i][j] = hei[i][j] = 0; } else { int area = 0; if (!i&&!j) { wid[i][j] = hei[i][j] = 1; area = 1; } else if (!i) { wid[i][j] = wid[i][j - 1] + 1; hei[i][j] = 1; area = 1; } else if (!j) { wid[i][j] = 1; hei[i][j] = hei[i - 1][j] + 1; area = 1; } else { wid[i][j] = 1 + wid[i][j - 1]; hei[i][j] = 1 + hei[i - 1][j]; area = max(area, maxArea(j - wid[i][j] + 1, j, i)); } ans = max(area, ans); area1[i][j] = area; } } } return ans; } };
相关文章推荐
- Linux服务器管理: RPM包
- 设计一个简易的有道词典
- mvc项目中实现备份数据库(sqlserver2005)
- TinyTemplate模板引擎火热出炉,正式开源了
- ORACLE添加作业
- JAVA类 学习笔记
- iOS屏幕旋转学习笔记
- (转)详解Python闭包
- C语言-二进制技巧
- 《Windows服务器配置与管理》---FTP服务器的搭建
- Ext.form组件
- java线程安全的单例模式
- springmvc+spring data 在用EntityManager类的query.getResultList()类型转换
- Android高效显示图片详解(三)
- Postfix邮件系统安装与配置:Postfix,Cyrus-IMAP,Cyrus-sasl,Dovecot和SPF
- iOS自动布局-Autoresizing
- 网站监控工具测试
- 隐藏文件夹及子文件
- 自定义类 作为item放入QList中 没有可用的复制构造函数或复制构造函数声明为“explicit”
- 聚焦