Skip to content

Commit dfaab2a

Browse files
authored
Create Maximal_Rectangle.cpp
1 parent 3d3fb40 commit dfaab2a

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

LeetCode_85/Maximal_Rectangle.cpp

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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

Comments
 (0)