C++ على LeetCode: كيفية حل المسائل وتطوير المهارات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا تعتبر لغة C++ اللغة المثالية لـ LeetCode (وكيف لا تفشل)

\n\n

إذا فتحت LeetCode وفكرت: "سأكتب كل شيء بلغة Python، فهي موجزة"، - توقف. من أجل النمو القوي والفهم الحقيقي للخوارزميات، تتفوق لغة C++ على أي لغة أخرى. لماذا؟ لأنها تجبرك على التفكير في الذاكرة والسرعة ودقائق التنفيذ. لا يوجد sort() "سحري" دون فهم كيفية عمله.

\n\n

في هذه المقالة، لن نقوم فقط بسرد المسائل. سنوضح كيفية التفكير بلغة C++ عند حل مسائل LeetCode، وما هي هياكل البيانات المطلوبة حقًا، وسنقدم قوالب جاهزة للكود. ستتعلم لماذا std::vector هو أفضل صديق لك، و std::unordered_map هو سلاحك السري.

\n\n

هل أنت مستعد؟ هيا بنا.

\n\n

أفضل 5 هياكل بيانات في C++ لـ LeetCode

\n\n

قبل أن تندفع لحل المسائل، تحتاج إلى تجميع "الترسانة". إليك ما ستحتاجه حقًا في 90% من الحالات:

\n\n
    \n
  • std::vector - مصفوفة ديناميكية. كل ما يتعلق بالتسلسلات، الفواصل الزمنية، المصفوفات.
  • \n
  • std::unordered_map - جدول تجزئة. للعد، البحث عن التكرارات، مسائل مجموع رقمين.
  • \n
  • std::set / std::unordered_set - مجموعات. عندما تحتاج إلى التحقق بسرعة من وجود عنصر.
  • \n
  • std::stack / std::queue / std::deque - للاجتيازات، متواليات الأقواس، BFS/DFS.
  • \n
  • std::pair - لا غنى عنه لتخزين الأزواج (مثل الإحداثيات + القيمة).
  • \n
\n\n

إليك مثال على شكل غلاف أساسي للتحليل التكراري باستخدام جدول التجزئة:

\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

أرأيت؟ أقل كود، أقصى فائدة.

\n\n

كيفية التعامل مع المسألة: قائمة مراجعة لـ C++

\n\n

خطأ المبتدئ هو كتابة الكود فورًا. الطريق الصحيح هو أولاً فهم بنية البيانات. بالنسبة لـ C++، هذا أمر بالغ الأهمية، لأن الاختيار الخاطئ للحاوية قد يكلفك تجاوز الحد الزمني (TLE).

\n\n

الخطوة 1. حدد نوع المسألة

\n
    \n
  • المصفوفات / السلاسل النصية → vector, string
  • \n
  • البحث عن التكرارات → unordered_set
  • \n
  • البرمجة الديناميكية → vector<vector<int>>
  • \n
  • الرسوم البيانية → vector<vector<int>> أو unordered_map<int, vector<int>>
  • \n
\n\n

الخطوة 2. اختر النموذج الخوارزمي

\n
    \n
  • الخوارزمية الجشعة - إذا كانت المسألة تتعلق بالحد الأدنى/الأقصى
  • \n
  • البحث الثنائي - للبيانات المرتبة
  • \n
  • المؤشران المزدوجان - للفواصل الزمنية
  • \n
  • DFS/BFS - للاجتيازات
  • \n
\n\n

الخطوة 3. اكتب الهيكل الأساسي

\n

لا تحاول التحسين فورًا. أولاً حل عملي، ثم إعادة الهيكلة.

\n\n

تحليل مسألة حقيقية: Two Sum (LeetCode #1)

\n\n

كلاسيكية. حتى لو كنت قد حللتها من قبل، فإنها تتجلى بشكل مختلف في C++.

\n\n

الشرط: لديك مصفوفة من الأعداد الصحيحة nums وعدد صحيح target. أعد فهارس الرقمين اللذين مجموعهما يساوي target.

\n\n

حل سيء (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

حل جيد (O(n) باستخدام unordered_map):

\n
#include <unordered_map>\n\nstd::vector<int> twoSum(std::vector<int>& nums, int target) {\n    std::unordered_map<int, int> seen; // القيمة -> الفهرس                

المدونات

توصيات الكتب