leetcode 85. Rectángulo más grande

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

Supongo que te gusta

Origin blog.csdn.net/weixin_43662405/article/details/111766494
Recomendado
Clasificación