leetcode 85. Rectángulo más grande
Tallo de la pregunta
Dada una matriz binaria bidimensional que contiene solo 0 y 1 y el tamaño de las filas x columnas, encuentre el rectángulo más grande que contenga solo 1 y devuelva su área.
Ejemplo 1:
Entrada: matriz = [["1", "0", "1", "0", "0"], ["1", "0", "1", "1", "1" ], ["1", "1", "1", "1", "1"], ["1", "0", "0", "1", "0"]]
salida: 6
explicaciones : El rectángulo más grande se muestra en la figura anterior.
Ejemplo 2:
Entrada: matriz = []
Salida: 0
Ejemplo 3:
Entrada: matriz = [["0"]]
Salida: 0
Ejemplo 4:
Entrada: matriz = [["1"]]
Salida: 1
Ejemplo 5:
Entrada: matriz = [["0", "0"]]
Salida: 0
Sugerencia:
filas == matriz.longitud
columnas == matriz [0]. Longitud
0 <= fila, columnas <= 200
matriz [i] [j] es '0' o '1'
responder
Atraviese la matriz, registre el número de 1 consecutivos en el lado derecho de cada 1 (incluido usted mismo), luego almacene las coordenadas de 1 en la cola,
y luego atraviese las coordenadas de cada 1 en la cola y verifique qué se puede formar cuando este 1 es la esquina superior izquierda El rectángulo con el área más grande, la
estrategia es verificar el número de 1 en la fila inferior y tomar constantemente el número de filas que se han atravesado * El número máximo de la menor cantidad de ocurrencias de una sola fila 1 es el área
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int rows = matrix.size();
if(rows == 0){
return 0;
}
int cols = matrix[0].size();
int maxRectangleArea = 0;
vector<vector<int> > rightContinuousOneCount(rows,vector<int>(cols,0));
queue<pair<int,int> > onePosition;
for(int i = 0 ; i < rows ; ++i){
for(int j = 0 ; j < cols ; ++j){
if(matrix[i][j] == '1'){
onePosition.push({
i,j});
int tempCols = j + 1;
int tempRightContinuousOneCount = 1;
while(tempCols < cols && matrix[i][tempCols] == '1'){
tempRightContinuousOneCount++;
tempCols++;
}
rightContinuousOneCount[i][j] = tempRightContinuousOneCount;
}
}
}
while(!onePosition.empty()){
int currentRow = onePosition.front().first;
int currentCol = onePosition.front().second;
onePosition.pop();
int tempMaxArea = rightContinuousOneCount[currentRow][currentCol];
int minRowLength = tempMaxArea;
int rowsCount = 1;
currentRow++;
rowsCount++;
while(currentRow < rows && rightContinuousOneCount[currentRow][currentCol] > 0){
minRowLength = min(minRowLength,rightContinuousOneCount[currentRow][currentCol]);
tempMaxArea = max(tempMaxArea,rowsCount * minRowLength);
currentRow++;
rowsCount++;
}
maxRectangleArea = max(maxRectangleArea,tempMaxArea);
}
return maxRectangleArea;
}
};