题目 : 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.
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix)
{
if (matrix.empty() || matrix[0].empty())
return 0;
int X = matrix.size(), Y = matrix[0].size(), res = 0;
vector<int> tmp(Y, 0);
for (int i=0;i<X;++i)
{
for (int j=0;j<Y;++j)
tmp[j] = matrix[i][j] == '0'?0:1+tmp[j];
res = max(res, largestRectangleArea(tmp));
}
return res;
}
int largestRectangleArea(vector<int> &height)
{
height.push_back(0);
int len = height.size();
stack<int> s;
s.push(0);
int curmax = 0;
for (int i=1;i<len;i++)
{
if (s.empty() || height[i] >= height[s.top()])
s.push(i);
else
{
int temp=s.top();
s.pop();
int tmp = height[temp]*(s.empty()?i:(i-s.top()-1));
curmax = curmax>tmp?curmax:tmp;
i--;
}
}
return curmax;
}
};
测试
#include "head.h"
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix)
{
if (matrix.empty() || matrix[0].empty())
return 0;
int X = matrix.size(), Y = matrix[0].size(), res = 0;
vector<int> tmp(Y, 0);
for (int i=0;i<X;++i)
{
for (int j=0;j<Y;++j)
tmp[j] = matrix[i][j] == '0'?0:1+tmp[j];
res = max(res, largestRectangleArea(tmp));
}
return res;
}
int largestRectangleArea(vector<int> &height)
{
height.push_back(0);
int len = height.size();
stack<int> s;
s.push(0);
int curmax = 0;
for (int i=1;i<len;i++)
{
if (s.empty() || height[i] >= height[s.top()])
s.push(i);
else
{
int temp=s.top();
s.pop();
int tmp = height[temp]*(s.empty()?i:(i-s.top()-1));
curmax = curmax>tmp?curmax:tmp;
i--;
}
}
return curmax;
}
};
int main()
{
Solution s;
vector<vector<char> > matrix;
int A[] = {'0', '0', '0', '0', '1'};
vector<char> tmp1(A, A+5);
matrix.push_back(tmp1);
int B[] = {'0', '1', '1', '1', '0'};
vector<char> tmp2(B, B+5);
matrix.push_back(tmp2);
int C[] = {'0', '1', '1', '1', '0'};
vector<char> tmp3(C, C+5);
matrix.push_back(tmp3);
int D[] = {'0', '0', '0', '0', '0'};
vector<char> tmp4(D, D+5);
matrix.push_back(tmp4);
cout<<s.maximalRectangle(matrix)<<endl;
}