Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
其实方法和(http://blog.youkuaiyun.com/anyicheng2015/article/details/42191979)类似。
class Solution {
public:
int maxArea(vector<int> &line) {
if(line.size() < 1) return 0;
stack<int> exstack;
line.push_back(0);
int sum = 0;
for(int ii = 0; ii < line.size(); ii ++) {
if(exstack.empty() || line[ii] > line[exstack.top()]) {
exstack.push(ii);
}
else{
int temp = exstack.top();
exstack.pop();
sum = max(sum, line[temp] * (exstack.empty() ? ii : ii - exstack.top() - 1));
ii --;
}
}
return sum;
}
int maximalRectangle(vector<vector<char> > &matrix) {
if(matrix.size() == 0) return 0;
int n = matrix.size();
int m = matrix[0].size();
if(m == 0) return 0;
vector<vector<int> > lines(n, vector<int>(m, 0));
for(int ii = 0; ii < n; ii ++) {
for(int jj = 0; jj < m; jj ++) {
if(ii == 0) {
lines[ii][jj] = matrix[ii][jj] == '1' ? 1 : 0;
}
else {
lines[ii][jj] = matrix[ii][jj] == '1' ? lines[ii - 1][jj] + 1 : 0;
}
}
}
int maxval = 0;
for(int ii = 0; ii < n; ii ++) {
int newmaxval = maxArea(lines[ii]);
maxval = (maxval > newmaxval) ? maxval : newmaxval;
}
return maxval;
}
};