题意理解
柱状图中找到最大矩形面积。
问题分析
转化为求柱状图的最大面积。参考:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
将矩阵看成是一行,一行的柱状图,先求出每一行的最大矩阵,再求出所有行的最大矩阵。
柱状图最大矩形面积用单调栈计算。
其他
https://leetcode-cn.com/problems/maximal-rectangle/submissions/
链接
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int row_len = matrix.size();
if (row_len == 0) {
return 0;
}
int col_len = matrix[0].size();
int max_area = INT_MIN;
//遍历每一行
for (int i = 0; i < row_len; i++) {
//计算每一行的柱状图
vector<int> histograms(col_len);
for (int j = 0; j < col_len; j++) {
for (int k = i; k >= 0; k--) {
if (matrix[k][j] == '1') {
histograms[j]++;
}
else {
break;
}
}
}
/*
for (int a : histograms) {
cout << a << '\t';
}
cout << endl;
*/
//计算这一行的最大面积
int maxRowArea = maxHistograms(histograms);
if (max_area < maxRowArea) {
max_area = maxRowArea;
}
}
return max_area;
}
int maxHistograms(vector<int>& histograms) {
int len = histograms.size();
if (len == 0) {
return 0;
}
vector<int> lefts(len);
vector<int> rights(len);
stack<int> my_stack;
for (int i = 0; i < len; i++) {
while(!my_stack.empty() && histograms[i] <= histograms[my_stack.top()]) {
my_stack.pop();
}
lefts[i] = my_stack.empty() ? -1 : my_stack.top();
my_stack.push(i);
}
/*
cout << "lefts" << endl;
for (int left : lefts) {
cout << left << '\t';
}
cout << endl;
*/
while(!my_stack.empty()) {
my_stack.pop();
}
for (int i = len - 1; i >= 0; i--) {
while (!my_stack.empty() && histograms[i] <= histograms[my_stack.top()]) {
my_stack.pop();
}
rights[i] = my_stack.empty() ? len : my_stack.top();
my_stack.push(i);
//cout << "i: " << i << '\t' << "rights: " << rights[i] << '\t' << "stack: " << i << endl;
}
/*
cout << "rights" << endl;
for (int right: rights) {
cout << right << '\t';
}
cout << endl;
*/
int maxArea=INT_MIN;
for (int i = 0; i < len; i++) {
int currArea = histograms[i] * (rights[i] - lefts[i] - 1);
if (maxArea < currArea) {
maxArea = currArea;
}
}
//cout << "maxArea " << maxArea << endl;
return maxArea;
}
};