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, dp
ordenació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;
}
};