1.主題の出典
2.トピック分析
実際、この質問では単調なスタックを使用する必要はありません。これは問題を単純化したものです。
アイデア:
- 2次元行列の各列の連続する1の数を前処理します。
- 各行の連続する1の数を並べ替えることは、列交換を実行することと同じです。並べ替え後、行が処理され、すべての列に形成される可能性のある長方形の領域が列挙されて、最大値であるが取得されます
q[j] * (j + 1)
。
これらの種類の質問はかなりたくさんあります。最大の長方形、最大の正方形などの場合、ほとんどのテストサイトは単調なスタック、dp
ソート+列挙です。
- 時間計算量:O(nmlogm)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;
}
};