|
| 1 | +#include <vector> |
| 2 | +#include <algorithm> // Para usar a função std::max e std::min |
| 3 | +#include <cstring> // Para a função memset |
| 4 | + |
| 5 | +class Solution { |
| 6 | +public: |
| 7 | + // Função principal que encontra o maior retângulo de 1's em uma matriz binária |
| 8 | + int maximalRectangle(std::vector<std::vector<char>>& matrix) { |
| 9 | + // Verifica se a matriz está vazia |
| 10 | + if (matrix.empty() || matrix[0].empty()) { |
| 11 | + return 0; |
| 12 | + } |
| 13 | + |
| 14 | + int m = matrix.size(); // Número de linhas |
| 15 | + int n = matrix[0].size(); // Número de colunas |
| 16 | + |
| 17 | + // Arrays para armazenar as alturas, limites esquerdos e direitos |
| 18 | + std::vector<int> heights(n, 0); |
| 19 | + std::vector<int> leftBoundaries(n, 0); |
| 20 | + std::vector<int> rightBoundaries(n, n); |
| 21 | + |
| 22 | + int maxRectangle = 0; // Variável para armazenar a área máxima do retângulo |
| 23 | + |
| 24 | + // Percorre todas as linhas da matriz |
| 25 | + for (int i = 0; i < m; i++) { |
| 26 | + int left = 0; // Inicializa a posição mais à esquerda |
| 27 | + int right = n; // Inicializa a posição mais à direita |
| 28 | + |
| 29 | + // Atualiza as alturas e os limites esquerdos |
| 30 | + updateHeightsAndLeftBoundaries(matrix[i], heights, leftBoundaries, left); |
| 31 | + |
| 32 | + // Atualiza os limites direitos |
| 33 | + updateRightBoundaries(matrix[i], rightBoundaries, right); |
| 34 | + |
| 35 | + // Calcula a área máxima do retângulo |
| 36 | + maxRectangle = calculateMaxRectangle(heights, leftBoundaries, rightBoundaries, maxRectangle); |
| 37 | + } |
| 38 | + |
| 39 | + return maxRectangle; |
| 40 | + } |
| 41 | + |
| 42 | +private: |
| 43 | + // Função para atualizar as alturas e os limites esquerdos |
| 44 | + void updateHeightsAndLeftBoundaries(std::vector<char>& row, std::vector<int>& heights, std::vector<int>& leftBoundaries, int& left) { |
| 45 | + for (int j = 0; j < heights.size(); j++) { |
| 46 | + if (row[j] == '1') { |
| 47 | + heights[j]++; // Aumenta a altura se for '1' |
| 48 | + leftBoundaries[j] = std::max(leftBoundaries[j], left); // Atualiza o limite esquerdo |
| 49 | + } else { |
| 50 | + heights[j] = 0; // Zera a altura se for '0' |
| 51 | + leftBoundaries[j] = 0; // Define o limite esquerdo como 0 |
| 52 | + left = j + 1; // Move o limite esquerdo para a próxima coluna |
| 53 | + } |
| 54 | + } |
| 55 | + } |
| 56 | + |
| 57 | + // Função para atualizar os limites direitos |
| 58 | + void updateRightBoundaries(std::vector<char>& row, std::vector<int>& rightBoundaries, int& right) { |
| 59 | + for (int j = rightBoundaries.size() - 1; j >= 0; j--) { |
| 60 | + if (row[j] == '1') { |
| 61 | + rightBoundaries[j] = std::min(rightBoundaries[j], right); // Atualiza o limite direito |
| 62 | + } else { |
| 63 | + rightBoundaries[j] = right; // Define o limite direito como a posição atual |
| 64 | + right = j; // Move o limite direito para a esquerda |
| 65 | + } |
| 66 | + } |
| 67 | + } |
| 68 | + |
| 69 | + // Função para calcular a área máxima do retângulo |
| 70 | + int calculateMaxRectangle(std::vector<int>& heights, std::vector<int>& leftBoundaries, std::vector<int>& rightBoundaries, int maxRectangle) { |
| 71 | + for (int j = 0; j < heights.size(); j++) { |
| 72 | + int width = rightBoundaries[j] - leftBoundaries[j]; // Calcula a largura do retângulo |
| 73 | + int area = heights[j] * width; // Calcula a área do retângulo |
| 74 | + maxRectangle = std::max(maxRectangle, area); // Atualiza a área máxima |
| 75 | + } |
| 76 | + return maxRectangle; |
| 77 | + } |
| 78 | +}; |
0 commit comments