Warum C++ die ideale Sprache für LeetCode ist (und wie man nicht scheitert)
\n\nWenn Sie LeetCode geöffnet und gedacht haben: „Ich schreibe einfach alles in Python, das ist prägnant“, – stopp. Für hartes Wachstum und ein echtes Verständnis von Algorithmen ist C++ jeder anderen Sprache überlegen. Warum? Weil es Sie zwingt, über Speicher, Geschwindigkeit und Implementierungsdetails nachzudenken. Kein „magisches“ sort() ohne zu verstehen, wie es funktioniert.
In diesem Artikel listen wir nicht nur Aufgaben auf. Wir zeigen Ihnen, wie Sie in C++ bei der Lösung von LeetCode-Aufgaben denken, welche Datenstrukturen wirklich benötigt werden, und geben fertige Code-Vorlagen. Sie erfahren, warum std::vector Ihr bester Freund ist und std::unordered_map Ihre Geheimwaffe.
Bereit? Los geht's.
\n\nDie Top 5 C++-Datenstrukturen für LeetCode
\n\nBevor Sie sich auf die Aufgaben stürzen, müssen Sie Ihr „Arsenal“ zusammenstellen. Hier ist, was in 90% der Fälle wirklich nützlich ist:
\n\n- \n
- std::vector – dynamisches Array. Alles, was mit Sequenzen, Intervallen, Matrizen zu tun hat. \n
- std::unordered_map – Hash-Tabelle. Für Zählungen, Duplikatsuche, Zwei-Summen-Aufgaben. \n
- std::set / std::unordered_set – Mengen. Wenn Sie schnell das Vorhandensein eines Elements prüfen müssen. \n
- std::stack / std::queue / std::deque – für Traversierungen, Klammerausdrücke, BFS/DFS. \n
- std::pair – unverzichtbar zum Speichern von Paaren (z. B. Koordinaten + Wert). \n
Hier ist ein Beispiel, wie eine grundlegende Hülle für eine Häufigkeitsanalyse mit einer Hash-Tabelle aussieht:
\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\nSehen Sie? Minimaler Code, maximaler Nutzen.
\n\nWie man an eine Aufgabe herangeht: Checkliste für C++
\n\nEin Anfängerfehler ist es, sofort Code zu schreiben. Der richtige Weg ist, zuerst die Datenstruktur zu verstehen. Für C++ ist das entscheidend, denn die falsche Wahl des Containers kann zu einem Time Limit Exceeded (TLE) führen.
\n\nSchritt 1. Bestimmen Sie den Aufgabentyp
\n- \n
- Arrays / Zeichenketten → vector, string \n
- Duplikatsuche → unordered_set \n
- Dynamische Programmierung → vector<vector<int>> \n
- Graphen → vector<vector<int>> oder unordered_map<int, vector<int>> \n
Schritt 2. Wählen Sie die algorithmische Paradigma
\n- \n
- Gieriger Algorithmus – wenn es um Minimum/Maximum geht \n
- Binäre Suche – für sortierte Daten \n
- Zwei Zeiger – für Intervalle \n
- DFS/BFS – für Traversierungen \n
Schritt 3. Schreiben Sie das Grundgerüst
\nVersuchen Sie nicht, sofort zu optimieren. Zuerst eine funktionierende Lösung, dann – Refactoring.
\n\nAnalyse einer echten Aufgabe: Two Sum (LeetCode #1)
\n\nEin Klassiker. Selbst wenn Sie sie schon gelöst haben, in C++ zeigt sie sich anders.
\n\nAufgabenstellung: Gegeben ist ein Array von ganzen Zahlen nums und eine ganze Zahl target. Geben Sie die Indizes der beiden Zahlen zurück, deren Summe target ergibt.
Schlechte Lösung (O(n²)):
\nstd::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\nGute Lösung (O(n) mit unordered_map):
\n#include <unordered_map>\n\nstd::vector<int> twoSum(std::vector<int>& nums, int target) {\n std::unordered_map<int, int> seen; // Wert -> Index