[Mプレフィックスと] lc1727。再配置後の最大の部分行列(並べ替え+単調スタック+毎週の一致224_3)

記事のディレクトリ

1.主題の出典

リンク:1727。再配置後の最大の部分行列

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;
    }
};

おすすめ

転載: blog.csdn.net/yl_puyu/article/details/112792732