LeetCode 2 : Min Cost to Connect All Points
Exercice à faire en C sur LeetCode, avant lundi prochain : https://leetcode.com/problems/min-cost-to-connect-all-points
Indice
Utiliser l'algorithme de Kruskal sur le graphe dont les sommets sont les points et les arêtes sont les distances entre les points.
LeetCode 1 : Number of Islands
- Vous devez vous inscrire sur https://leetcode.com (en cliquant sur Create Account).
- Exercice à faire en C sur LeetCode : https://leetcode.com/problems/number-of-islands
- Une vidéo explicative pour utiliser LeetCode : https://youtu.be/q5dEFWMO8-o
Indice
Le problème revient à calculer les composantes connexes du graphe dont les sommets sont les cases de la grille et où chaque case a 4 arêtes possibles avec les cases voisines.
Pour calculer le nombre de composantes connexes, on peut utiliser un parcours en profondeur (ou en largeur). On peut directement utiliser grid comme tableau des vus (en mettant une case à '0' après l'avoir visitée).
// Parcours en profondeur depuis la case (i, j)
void dfs(char** grid, int n, int p, int i, int j) {
...
}
int numIslands(char** grid, int gridSize, int* gridColSize) {
int n = gridSize, p = gridColSize[0]; // n lignes, p colonnes
int k = 0; // nombre de composantes connexes
for(int i = 0; i < n; i++)
for(int j = 0; j < p; j++)
...
return k;
}
Solution
// Solution en O(l) avec un parcours en profondeur, où l = np est le nombre de cases de la grille
// Plutôt qu'utiliser une matrice de booléens vus, on peut mettre les cases visitées à 0 pour éviter de les revisiter
void dfs(char** grid, int n, int p, int i, int j) {
if(grid[i][j] == '0') return;
grid[i][j] = '0';
if(i > 0) // chaque sommet a 4 voisins
dfs(grid, n, p, i - 1, j);
if(i < n - 1)
dfs(grid, n, p, i + 1, j);
if(j > 0)
dfs(grid, n, p, i, j - 1);
if(j < p - 1)
dfs(grid, n, p, i, j + 1);
}
int numIslands(char** grid, int gridSize, int* gridColSize) {
int n = gridSize, p = gridColSize[0];
int k = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < p; j++)
if(grid[i][j] == '1') {
dfs(grid, n, p, i, j);
k++;
}
return k;
}
Cours 18/10
- Fin TD Grammaire.
- Cours Arbre couvrant jusqu'à algorithme de Kruskal (non démontré)
À faire pendant les vacances (pour la rentrée du lundi 3 novembre) :
- DM
- LeetCode 1
Colle 1
- Langages réguliers : tout le cours.
- Automate : tout le cours.
- Cours théorème de Kleene : tout le cours.
- Grammaires : tout le cours.
- Graphes : révisions de MP2I.
Cours 9/10
- Fin TD Kleene et TD Grammaire jusqu'à III.2.
Cours 6/10
- Fin cours grammaires.
- Exercices 1 et 2 du TD grammaires.
Cours 10/02
- Cours Grammaires jusqu'à grammaire linéaire
- Fin TD Automates et TD Kleene ex 1 et 3.
À faire :
- MPI* : ex 4 et 5 du TD Kleene
- MPI : finir ex 2 du TD Kleene
Cours 29/09
Fin du cours théorème de Kleene.
Cours 25/09
- TD Automates : jusqu'à Ex3 Q4 en MPI et Ex5 Q2 en MPI*.
- À faire pour jeudi prochain : Ex 3 et 4 pour MPI et Ex 4 et 5 pour MPI*.
