思路:
方法一:时间复杂度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)。