[Prefijo M y] lc1727. La submatriz más grande después del reordenamiento (clasificación + pila monótona + coincidencia semanal 224_3)

Directorio de artículos

1. Fuente del tema

Enlace: 1727. La submatriz más grande después del reordenamiento

2. Análisis de temas

De hecho, esta pregunta no necesita usar una pila monótona, lo cual es una simplificación del problema.

Ideas:

  • Procese previamente el número de unos consecutivos en cada columna de la matriz bidimensional.
  • Ordenar el número de unos consecutivos en cada fila equivale a realizar un intercambio de columnas. Después de ordenar, se procesa la fila y se enumera el área rectangular que se puede formar en todas las columnas para tomar el valor máximo, que es q[j] * (j + 1).

Hay bastantes de este tipo de preguntas Para el rectángulo más grande, el cuadrado más grande, etc., la mayoría de los sitios de prueba son monótonos apilados, dpordenación + enumeración.


  • Complejidad de tiempo : O (nmlogm) O (nmlogm)O ( n m l o g m ) .
  • Complejidad espacial : O (m) O (m)O ( m )

Código:

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

Supongo que te gusta

Origin blog.csdn.net/yl_puyu/article/details/112792732
Recomendado
Clasificación