参考链接
http://blog.youkuaiyun.com/littlestream9527/article/details/19641013
http://blog.youkuaiyun.com/nandawys/article/details/9245119
http://www.cnblogs.com/yingzhongwen/archive/2013/04/26/3044560.html
题目描述
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.
题目分析
这个题目有两种经典的解法。
一:转换成柱形图求最大面积。n^2
二:浅谈用极大化思想解决最大子矩形问题
总结
代码示例
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix) {
int x = matrix.size();
if(0 == x) return 0;
int y = matrix[0].size();
if(0 == y) return 0;
vector<vector<int> > result(x, vector<int>(y));
for(int i = 0; i < x; ++i)
for(int j = 0; j < y; ++j)
result[i][j] = '0' == matrix[i][j]? 0: 1;
for(int i = 1; i < x; ++i)
for(int j = 0; j < y; ++j)
result[i][j] += 0 == result[i][j]? 0: result[i-1][j];
int ret = 0;
for(int i = 0; i < x; ++i)
ret = max(ret, maxArea(result[i]));
return ret;
}
int maxArea(vector<int>& line)
{
stack<int> S;
line.push_back(0);
int sum = 0;
for (int i = 0; i < line.size(); i++) {
if (S.empty() || line[i] > line[S.top()]) S.push(i);
else {
int tmp = S.top();
S.pop();
sum = max(sum, line[tmp]*(S.empty()? i : i-S.top()-1));
i--;
}
}
return sum;
}
};
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix){
if(matrix.size()==0)
return 0;
int n = matrix[0].size();
vector<int> H(n);
vector<int> L(n);
vector<int> R(n,n);
int res = 0;
for(int i=0;i<matrix.size();++i){
int left = 0, right = n;
for(int j=0;j<n;++j){
if(matrix[i][j]=='1'){
++H[j];
L[j] = max(left,L[j]);
}
else{
H[j] = 0; left = j+1; L[j] = 0; R[j] = n;
}
}
for(int j=n-1;j>=0;--j){
if(matrix[i][j]=='1'){
R[j] = min(R[j],right);
res = max(res, (R[j]-L[j])*H[j]);
}
else{
right = j;
}
}
}
return res;
}
};
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix){
if(matrix.size()==0)
return 0;
int n = matrix[0].size();
vector<int> H(n);
vector<int> L(n);
vector<int> R(n,n);
int res = 0;
for(int i=0;i<matrix.size();++i){
int left = 0, right = n;
for(int j=0;j<n;++j){
if(matrix[i][j]=='1'){
++H[j];
L[j] = max(left,L[j]);
}
else{
H[j] = 0; left = j+1; L[j] = 0; R[j] = n;
}
}
for(int j=n-1;j>=0;--j){
if(matrix[i][j]=='1'){
R[j] = min(R[j],right);
res = max(res, (R[j]-L[j])*H[j]);
}
else{
right = j;
}
}
}
return res;
}
};
推荐学习C++的资料
C++标准函数库
在线C++API查询
map使用方法
queue使用方法
vector使用方法