C++ sur LeetCode : comment résoudre des problèmes et améliorer ses compétences

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi le C++ est le langage idéal pour LeetCode (et comment ne pas échouer)

\n\n

Si vous avez ouvert LeetCode et pensé : « Je vais tout écrire en Python, c'est concis », — stop. Pour une progression intensive et une véritable compréhension des algorithmes, le C++ surpasse tout autre langage. Pourquoi ? Parce qu'il vous oblige à réfléchir à la mémoire, à la vitesse et aux subtilités d'implémentation. Pas de sort() « magique » sans comprendre son fonctionnement.

\n\n

Dans cet article, nous ne nous contenterons pas de lister des problèmes. Nous montrerons comment penser en C++ lors de la résolution de problèmes LeetCode, quelles structures de données sont réellement nécessaires, et nous fournirons des modèles de code prêts à l'emploi. Vous apprendrez pourquoi std::vector est votre meilleur ami, et std::unordered_map votre arme secrète.

\n\n

Prêt ? C'est parti.

\n\n

Top 5 des structures de données C++ pour LeetCode

\n\n

Avant de vous lancer dans la résolution de problèmes, il faut constituer votre « arsenal ». Voici ce qui sera vraiment utile dans 90% des cas :

\n\n
    \n
  • std::vector — tableau dynamique. Tout ce qui concerne les séquences, les intervalles, les matrices.
  • \n
  • std::unordered_map — table de hachage. Pour les comptages, la recherche de doublons, les problèmes de somme de deux nombres.
  • \n
  • std::set / std::unordered_set — ensembles. Quand il faut vérifier rapidement la présence d'un élément.
  • \n
  • std::stack / std::queue / std::deque — pour les parcours, les séquences de parenthèses, BFS/DFS.
  • \n
  • std::pair — indispensable pour stocker des paires (par exemple, coordonnées + valeur).
  • \n
\n\n

Voici un exemple d'enveloppe de base pour l'analyse fréquentielle utilisant une table de hachage :

\n\n
#include <unordered_map>\n#include <vector>\n#include <string>\n\nstd::unordered_map<std::string, int> countWords(const std::vector<std::string>& words) {\n    std::unordered_map<std::string, int> freq;\n    for (const auto& w : words) {\n        freq[w]++;\n    }\n    return freq;\n}\n
\n\n

Vous voyez ? Un minimum de code, un maximum d'efficacité.

\n\n

Comment aborder un problème : checklist pour le C++

\n\n

L'erreur du débutant est d'écrire le code immédiatement. La bonne approche est d'abord de comprendre la structure de données. Pour le C++, c'est crucial car un mauvais choix de conteneur peut vous coûter un Time Limit Exceeded (TLE).

\n\n

Étape 1. Déterminez le type de problème

\n
    \n
  • Tableaux / chaînes → vector, string
  • \n
  • Recherche de doublons → unordered_set
  • \n
  • Programmation dynamique → vector<vector<int>>
  • \n
  • Graphes → vector<vector<int>> ou unordered_map<int, vector<int>>
  • \n
\n\n

Étape 2. Choisissez le paradigme algorithmique

\n
    \n
  • Algorithme glouton — si le problème concerne un minimum/maximum
  • \n
  • Recherche binaire — pour les données triées
  • \n
  • Deux pointeurs — pour les intervalles
  • \n
  • DFS/BFS — pour les parcours
  • \n
\n\n

Étape 3. Écrivez le squelette

\n

N'essayez pas d'optimiser tout de suite. D'abord une solution fonctionnelle, ensuite le refactoring.

\n\n

Analyse d'un problème réel : Two Sum (LeetCode #1)

\n\n

Un classique. Même si vous l'avez déjà résolu, en C++ il se révèle différemment.

\n\n

Énoncé : Soit un tableau d'entiers nums et un entier target. Retournez les indices des deux nombres dont la somme est égale à target.

\n\n

Mauvaise solution (O(n²)) :

\n
std::vector<int> twoSum_brute(std::vector<int>& nums, int target) {\n    for (int i = 0; i < nums.size(); ++i) {\n        for (int j = i + 1; j < nums.size(); ++j) {\n            if (nums[i] + nums[j] == target) {\n                return {i, j};\n            }\n        }\n    }\n    return {};\n}\n
\n\n

Bonne solution (O(n) avec unordered_map) :

\n
#include <unordered_map>\n\nstd::vector<int> twoSum(std::vector<int>& nums, int target) {\n    std::unordered_map<int, int> seen; // valeur -> indice                

Blogs

Book Recommendations