【LeetCode】Maximal Rectangle
来源:互联网 发布:java中list.sort 编辑:程序博客网 时间:2024/06/18 14:03
题目描述:
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'组成的最大矩形面积。
解法1:
自己一开始的想法是这样的:
1、从左上开始向右下遍历
2、每当遍历到一个元素matrix[i][j],则计算matrix[0][0]到matrix[i][j]区域内合法的最大矩形面积。
进行第二步操作时,可以用下DP思想来降低时间复杂度,用dp[i][j]来储存i,j位置左边和上边连续的'1'的长度。
代码如下:
class Solution {public:int maximalRectangle(vector<vector<char> > &matrix) {if (matrix.empty() || matrix[0].empty())return 0;int area(0);vector<vector<pair<int, int>>> dp(matrix.size() + 1, vector<pair<int, int>>(matrix[0].size() + 1, make_pair(0, 0)));for (int i = 0; i < matrix.size();i++)for (int j = 0; j < matrix[i].size(); j++){if (matrix[i][j] == '0')continue;int x = dp[i + 1][j].first + 1;int y = dp[i][j + 1].second + 1;dp[i + 1][j + 1] = make_pair(x, y);int minh = y;for (int k = 0; k < x; k++){minh = std::min(minh, dp[i + 1][j - k + 1].second);area = std::max(area, (k + 1)*minh);}}return area;}};
解法二:
用前面Largest Rectangle in Histogram的解法来做。
从上往下逐行计算,遍历到第i行时,与第0行围成一个直方图,计算该区域最大的矩形面积,最后得出答案。
代码如下:
class Solution {public:int area;int maximalRectangle(vector<vector<char> > &matrix) {if (matrix.empty() || matrix[0].empty())return 0;area = 0;vector<int> h(matrix[0].size() + 1, 0);for (int i = 0; i < matrix.size(); i++){for (int j = 0; j < matrix[i].size(); j++){if (matrix[i][j] == '0')h[j] = 0;elseh[j]++;}getArea(h);}return area;}void getArea(vector<int> &h){stack<int> height;int i = 0;while (i < h.size()){if (height.empty() || h[i] >= h[height.top()])height.push(i++);else{int n = height.top();height.pop();if (height.empty())n = h[n] * i;elsen = h[n] * (i - height.top() - 1);area = std::max(n, area);}}}};
分别提交三次,解法一时间为:96,116,136;解法二为:68,80,68,第二种方法应该效率更高一点。
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)
- VC/MFC子窗体向父窗体传递参数的几种方法
- MTK 铃声音量每级增益值修改为使用Audio player 16级增益值的方法
- 分布式 高性能Web服务器架构
- Cocos2d-x 3.0 回调函数的变化
- 数学分析题:约瑟夫环
- 【LeetCode】Maximal Rectangle
- MTK 音频和BMT简介
- 电子产品检验-检验中心
- 点点滴滴(一)
- 依赖注入与控制反转
- 关联自己的应用程序到系统右键菜单
- Cocos2d-x 3.0 触摸事件处理机制
- zoj 3396 Conference Call
- 自绘ComboBox改变颜色和大小