LintCode-最大正方形&最大矩形
2017-07-07 14:59
246 查看
最大正方形
分析一下样例,
位置3,5的最大正方形
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
由(i-1,j),(i-1,j-1),(i,j-1)三个位置的最大正方形最小值决定:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
如果用二维数组max[i][j]表示从左上角到i,j位置的最大正方形面积,则
i≠0 且j≠0 时max[i][j]=min(max[i-1][j],min(max[i][j-1],max[i-1][j-1]))+1
i=0 或j=0 时max[i][j]=matrix[i][j]
最大矩形
最大矩形仍可以用动态规划解,但需要比较的元素太多,尝试了一下放弃了,直接套用直方图最大面积的效果更好一些
还发现了一个有错的地方,max_x=0的时候是从第二个元素开始判断的,要改成-1。
描述 在一个二维01矩阵中找到全为1的最大正方形 样例 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 返回 4
分析一下样例,
位置3,5的最大正方形
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
由(i-1,j),(i-1,j-1),(i,j-1)三个位置的最大正方形最小值决定:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
如果用二维数组max[i][j]表示从左上角到i,j位置的最大正方形面积,则
i≠0 且j≠0 时max[i][j]=min(max[i-1][j],min(max[i][j-1],max[i-1][j-1]))+1
i=0 或j=0 时max[i][j]=matrix[i][j]
class Solution { public: /** * @param matrix: a matrix of 0 and 1 * @return: an integer */ int maxSquare(vector<vector<int> > &matrix) { // write your code here if(matrix.empty()) return 0; vector<vector<int>> max(matrix.size(),vector<int>(matrix[0].size())); int n=0; for(int i=0;i<matrix.size();i++) { for(int j=0;j<matrix[i].size();j++) { if(matrix[i][j]) { if(i==0 || j==0) max[i][j]=1; else { max[i][j]=min(max[i-1][j],min(max[i][j-1],max[i-1][j-1]))+1; } if(max[i][j]>n) { n=max[i][j]; } } else { max[i][j]=0; } } } return n*n; } };
最大矩形
描述 给你一个二维矩阵,权值为False和True,找到一个最大的矩形,使得里面的值全部为True,输出它的面积 样例 给你一个矩阵如下 [ [1, 1, 0, 0, 1], [0, 1, 0, 0, 1], [0, 0, 1, 1, 1], [0, 0, 1, 1, 1], [0, 0, 0, 0, 1] ] 输出6
最大矩形仍可以用动态规划解,但需要比较的元素太多,尝试了一下放弃了,直接套用直方图最大面积的效果更好一些
还发现了一个有错的地方,max_x=0的时候是从第二个元素开始判断的,要改成-1。
class Solution { public: /** * @param matrix a boolean 2D matrix * @return an integer */ struct increase{ int x,y; }; int largestRectangleArea(vector<int> height) { // write your code here vector<increase> h(1); h[0].x=-1; h[0].y=-1; height.push_back(0); int max=0; int max_x=-1; for(int i=0;i<height.size();i++) { increase t; t.x=i; t.y=height[i]; while(t.y<=h.back().y) { if(h.back().x>max_x) { for(int j=1;j<h.size();j++) { auto s=(h.back().x-h[j-1].x)*h[j].y; if(s>max) { max=s; } } max_x=h.back().x; } h.pop_back(); } h.push_back(t); } return max; } int maximalRectangle(vector<vector<bool> > &matrix) { // Write your code here if(matrix.empty()) return 0; int maxsize=0; vector<int> height(matrix[0].size()); for(int i=0;i<matrix.size();i++) { for(int j=0;j<matrix[i].size();j++) { if(matrix[i][j]) { height[j]++; } else { height[j]=0; } } maxsize=max(largestRectangleArea(height),maxsize); } return maxsize; } };
相关文章推荐
- 柱状图中找最大矩形 & 矩阵中找最大的仅含相同值的矩形区域
- CF 135B Rectangle and Square(正方形判断 &amp; 矩形判断)(数学)
- 直方图最大矩形覆盖-LintCode
- [USACO5.3]巨大的牛棚Big Barn && 洛谷【p1387】最大正方形(动态规划)
- lintcode 直方图最大矩形覆盖与最大子矩阵
- 正方形不是矩形" << 【OOD设计原则之里氏替换原则(LSP)--- 设计模式之禅读书笔记
- lintcode(122)直方图最大矩形覆盖
- lintcode[122]:直方图内最大矩形面积
- 如何判断任意四个点可以组成矩形及正方形 && 点绕另外一个点旋转后的坐标
- 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest A】【水题 讨论】Alex Origami Squares 矩形内置三个最大正方形
- {bzoj2338 [HNOI2011]数矩形 && NBUT 1453 LeBlanc}平面内找最大矩形
- HDU 5100 Chessboard 用 k × 1 的矩形覆盖 n × n 的正方形棋盘
- **[Lintcode]Maximal Square 最大正方形
- hdu 1505 && hdu1506 &&hdu 2830 && 2870 总结---------DP之状图选最大矩形
- HDU 5100 Chessboard (用k×1的矩形覆盖n×n的正方形)(找规律)
- [LintCode] Maximal Rectangle 最大矩形
- 美团2017编程题—拼凑钱币&大富翁游戏&最大矩形面积&最长公共连续子串
- lintcode(436)最大正方形
- LintCode:M-最大正方形
- 【难】【DP】计算bool矩阵中,仅包含1的最大矩形和最大正方形