Maison >développement back-end >tutoriel php >Arrangement valide des paires
2097. Arrangement valide des paires
Difficulté : Difficile
Sujets : Recherche en profondeur d'abord, graphique, circuit eulérien
Vous recevez un tableau d'entiers 2D indexé 0 paires où paires[i] = [starti, endi]. Un arrangement de paires est valide si pour chaque indice i où 1 <= i < paires.longueur, nous avons fini-1 == débuti.
Renvoyer tout arrangement de paires valide.
Remarque : Les entrées seront générées de telle sorte qu'il existe un arrangement valide de paires.
Exemple 1 :
Exemple 2 :
Exemple 3 :
Contraintes :
Indice :
Solution :
Nous pouvons l'aborder comme un problème de chemin eulérien en théorie des graphes. Dans ce cas, les paires peuvent être traitées comme des arêtes et les valeurs contenues dans les paires (le début et la fin) peuvent être traitées comme des nœuds. Nous devons trouver un chemin eulérien, qui est un chemin qui utilise chaque arête exactement une fois, et la fin d'une arête doit correspondre au début de l'arête suivante.
Implémentons cette solution en PHP : 2097. Arrangement valide des paires
<?php /** * @param Integer[][] $pairs * @return Integer[][] */ function validArrangement($pairs) { ... ... ... /** * go to ./solution.php */ } // Example usage: $pairs1 = [[5, 1], [4, 5], [11, 9], [9, 4]]; $pairs2 = [[1, 3], [3, 2], [2, 1]]; $pairs3 = [[1, 2], [1, 3], [2, 1]]; print_r(validArrangement($pairs1)); // Output: [[11, 9], [9, 4], [4, 5], [5, 1]] print_r(validArrangement($pairs2)); // Output: [[1, 3], [3, 2], [2, 1]] print_r(validArrangement($pairs3)); // Output: [[1, 2], [2, 1], [1, 3]] ?> </p> <h3> Explication: </h3> <ol> <li> <p><strong>Construction de graphiques</strong> :</p> <ul> <li>Nous construisons le graphique en utilisant une liste de contiguïté où chaque clé est un nœud de départ et la valeur est une liste de nœuds de fin.</li> <li>Nous maintenons également le degré sortant et le degré entrant pour chaque nœud, ce qui nous aidera à trouver le nœud de départ du chemin eulérien.</li> </ul> </li> <li> <p><strong>Trouver le nœud de départ</strong> :</p> <ul> <li>Un chemin eulérien commence à un nœud où le degré sortant est supérieur de 1 au degré entrant (si un tel nœud existe).</li> <li>Si aucun nœud de ce type n'existe, le graphique est équilibré et nous pouvons commencer à n'importe quel nœud.</li> </ul> </li> <li> <p><strong>Algorithme de Hierholzer</strong> :</p> <ul> <li>Nous partons du startNode et suivons les bords à plusieurs reprises, les marquant comme visités en les supprimant de la liste de contiguïté.</li> <li>Une fois que nous atteignons un nœud sans plus d'arêtes sortantes, nous revenons en arrière et construisons le résultat.</li> </ul> </li> <li> <p><strong>Renvoyer le résultat</strong> :</p> <ul> <li>Le résultat est construit dans l'ordre inverse à cause de la façon dont on revient en arrière, donc on l'inverse à la fin.</li> </ul> </li> </ol> <h3> Exemple de sortie : </h3> <pre class="brush:php;toolbar:false"><?php /** * @param Integer[][] $pairs * @return Integer[][] */ function validArrangement($pairs) { ... ... ... /** * go to ./solution.php */ } // Example usage: $pairs1 = [[5, 1], [4, 5], [11, 9], [9, 4]]; $pairs2 = [[1, 3], [3, 2], [2, 1]]; $pairs3 = [[1, 2], [1, 3], [2, 1]]; print_r(validArrangement($pairs1)); // Output: [[11, 9], [9, 4], [4, 5], [5, 1]] print_r(validArrangement($pairs2)); // Output: [[1, 3], [3, 2], [2, 1]] print_r(validArrangement($pairs3)); // Output: [[1, 2], [2, 1], [1, 3]] ?>
Cette approche trouve efficacement un arrangement valide de paires en traitant le problème comme un problème de chemin eulérien dans un graphe orienté.
Liens de contact
Si vous avez trouvé cette série utile, pensez à donner une étoile au référentiel sur GitHub ou à partager la publication sur vos réseaux sociaux préférés ?. Votre soutien signifierait beaucoup pour moi !
Si vous souhaitez du contenu plus utile comme celui-ci, n'hésitez pas à me suivre :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!