1、单调栈
考虑到我们需要寻找只包含1的最大矩阵,因此我们必须要求这些1是相连的。我们可以考虑这样一种特殊情况,假如矩阵只有一行,则这个矩阵中包含1的最大矩阵可以理解为这个矩阵中面积最大的矩形。那么当这个矩阵有多行时,我们可以使用一个新矩阵记录原先矩阵在竖直方向上连续出现1的次数,然后我们对每一行依次求解该行上的值对应的最大面积,等同于寻找矩阵中的最大矩形。具体单调栈参考LeetCode-84-柱状图中最大的矩形。
class Solution {
public:
int largestRectangleArea(vector<int> &heights) {
int result = INT_MIN;
stack<int> st;
heights.insert(heights.begin(), -1);
heights.push_back(-1);
for (int i = 0; i < heights.size(); ++i) {
while (!st.empty() && heights[st.top()] > heights[i]) {
int cur = st.top();
st.pop();
int left = st.top() + 1;
int right = i;
result = max((right - left) * heights[cur], result);
}
st.push(i);
}
return result;
}
int maximalRectangle(vector<vector<char>> &matrix) {
int rows = matrix.size();
int cols = matrix[0].size();
vector<vector<int>> m(rows, vector<int>(cols, 0));
for (int i = 0; i < cols; ++i) {
int times = 0;
for (int j = 0; j < rows; ++j) {
if (matrix[j][i] == '1') {
m[j][i] = ++times;
} else {
m[j][i] = 0;
times = 0;
}
}
}
int max_area = INT_MIN;
for (int i = 0; i < rows; ++i) {
max_area = max(largestRectangleArea(m[i]), max_area);
}
return max_area;
}
};