题目
给定一个只包含 0、1 的 m x n 的矩阵,求矩阵当中只包含1的最大矩阵。
输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]
输出:6
解释:最大矩形如上图所示。
原题链接:https://leetcode-cn.com/problems/maximal-rectangle/
思路
这个题可以理解为《柱状图中最大的矩形》题目的改头换面版。思路回去看《柱状图中最大的矩形》。
对于每一行,构造一个新的 height 数组。然后问题就转成了求柱状图中最大的矩形。
- 复杂度分析
- 时间复杂度 O(mn)。柱状图求最大矩形为O(n),m 行也就是 O(mn)
- 空间复杂度 O(n)。
代码
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
int max_area = -1;
vector<int> heights(n, 0);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '1') {
heights[j]++;
}
else {
heights[j] = 0;
}
}
int cur_area = maxArea(heights);
max_area = max(max_area, cur_area);
}
return max_area;
}
int maxArea(vector<int>& heights) {
int n = heights.size();
int max_area = -1;
vector<int> left(n, -1);
vector<int> right(n, n);
stack<int> mono_stack;
for (int i = 0; i < n; i++) {
while (!mono_stack.empty() && heights[mono_stack.top()] >= heights[i]) {
right[mono_stack.top()] = i;
mono_stack.pop();
}
if (!mono_stack.empty()) {
left[i] = mono_stack.top();
}
mono_stack.push(i);
}
for (int i = 0; i < n; i++) {
max_area = max(max_area, (right[i] - left[i] - 1) * heights[i]);
}
return max_area;
}
};