Maximal Rectangle
2015-07-17 22:07
337 查看
思路:
方法一:时间复杂度O(N^2),空间复杂度O(1)。
依据上一题
例如:
将matrix =
转化为:
然后对每一行计算一次最大矩形面积,选最大的。
方法二:时间复杂度O(N),空间复杂度O(1)。
方法一:时间复杂度O(N^2),空间复杂度O(1)。
依据上一题
Largest Rectangle in Histogram的思路,可以将给定的matrix转化为包含矩形信息的数组。
例如:
将matrix =
0 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0
转化为:
0 1 1 0 1 1 2 0 1 0 0 0 1 2 0 1 1 2 3 0 0 0 0 0 0
然后对每一行计算一次最大矩形面积,选最大的。
class Solution { private: int calculate_area(vector<int>& line) { stack<int> s; line.push_back(0); int ans = 0; for(int i = 0; i < line.size();) { if(s.empty() || line[i] > line[s.top()]) { s.push(i); ++i; }else { int tmp = s.top(); s.pop(); ans = max(ans, line[tmp] * (s.empty() ? i : i - s.top() - 1)); } } return ans; } public: int maximalRectangle(vector<vector<char>>& matrix) { if(matrix.empty()) return 0; //convert problem int m = matrix.size();//m rows int n = matrix[0].size();//n cols vector<vector<int>> line = vector<vector<int>>(m, vector<int>(n, 0)); for(int i = 0; i < m; ++i) { for(int j = 0; j < n; ++j) { if(i == 0) { line[i][j] = ((matrix[i][j] == '1') ? 1 : 0); }else { line[i][j] = (matrix[i][j] == '1' ? (line[i - 1][j] + 1) : 0); } } } //calculate every row int max_area = 0; for(int i = 0; i < m; ++i) { max_area = max(max_area, calculate_area(line[i])); } return max_area; } };
方法二:时间复杂度O(N),空间复杂度O(1)。
相关文章推荐
- 黑马程序员----拜拜DOS,helloGUI
- 黑马程序员----网络编程
- ajaxSubmit上传文件出现下载提示框问题
- VXLAN技术学习笔记
- [Django]Solve "No module named _sqlite3" when deploying django in CentOS
- Learning about boost libary---boost库学习
- 自然语言处理的中文分词方法
- axure使用基础教程
- Node.js使用MySQL的连接池
- Objective-C学习笔记
- WireShark默认不检查校验和的解决办法
- Java中,什么是实现对象序列化?如何实现对象序列化?
- 贪心 hdu4864 Task
- 准备开源一套异形UI控件
- C/C++数组名与指针区别深入探索
- 自定义指南针的实现
- 自守数判断
- html与JacaScript中的重要思想:预留后路、向后兼容、js分离
- WPF自定义窗口基类
- linux网络协议栈结构