1. 题目来源
2. 题目解析
其实本题不需要使用单调栈,算是对问题的一个简化。
思路:
- 预处理二维矩阵每一列上的连续 1 的数量。
- 对每一行的连续 1 数量进行排序,相当于进行了列交换,排序后对该行进行处理,枚举所有列上可能构成的矩形面积取个最大值即可,即为
q[j] * (j + 1)
。
这类问题还是蛮多的,求最大矩形、最大正方形等等,大多考点为单调栈、dp
、排序+枚举。
- 时间复杂度: O ( n m l o g m ) O(nmlogm) O(nmlogm)。
- 空间复杂度: O ( m ) O(m) O(m)
代码:
class Solution {
public:
int largestSubmatrix(vector<vector<int>>& matrix) {
int n = matrix.size(), m = matrix[0].size();
for (int i = 1; i < n; i ++ )
for (int j = 0; j < m; j ++ )
if (matrix[i][j])
matrix[i][j] += matrix[i - 1][j];
int res = 0;
vector<int> q(m);
for (int i = 0; i < n; i ++ ) {
for (int j = 0; j < m; j ++ ) q[j] = matrix[i][j];
sort(q.begin(), q.end(), greater<int>());
for (int j = 0; j < m; j ++ ) res = max(res, q[j] * (j + 1));
}
return res;
}
};