عدّ المصفوفات الفرعية ذات المجموع المستهدف
دمج المجاميع السابقة مع خريطة تجزئة
عدّ المصفوفات الفرعية ذات المجموع المستهدف درس مجاني في Competitive Programming Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Competitive Programming Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.
سؤال أصعب
إليك التحدي الآن: احسب عدد المصفوفات الفرعية التي يساوي مجموعها قيمة مستهدفة k. إن فحصت كل زوج فسيكون ذلك بطيئًا، لكن المجاميع التراكمية مع خريطة تجزئة تحل المسألة. 🎯
أعد صياغتها باستخدام المجاميع التراكمية
يساوي مجموع المصفوفة الفرعية prefix[r + 1] ناقص prefix[l]. لذا يعني أن يكون المجموع k أن تختلف قيمتا مجموع تراكمي بمقدار k بالضبط.
إعادة الترتيب الأساسية
إذا كان المجموع التراكمي الحالي هو P، فأنت تحتاج إلى مجموع تراكمي سابق يساوي P ناقص k. هذه إعادة الترتيب هي الفكرة الأساسية كلها.
need = current_prefix - kاحسب العدد، ولا تبحث
بدلًا من الرجوع والفحص في كل مرة، تذكّر عدد مرات ظهور كل قيمة من قيم المجموع التراكمي. يجيبك العدّاد المتراكم في O(1).
استخدم خريطة التكرارات
يربط القاموس كل قيمة من قيم المجموع التراكمي بعدد مرات ظهورها. وتحول هذه الخريطة البحث إلى عدّ فوري.
from collections import defaultdict
seen = defaultdict(int)هيّئ المجموع التراكمي الفارغ
قبل الحلقة، سجّل أن المجموع التراكمي 0 ظهر مرة واحدة. تتيح هذه التهيئة احتساب المصفوفات الفرعية التي تبدأ عند الفهرس 0.
seen[0] = 1حلقة المرور الواحد
لكل عنصر، حدّث المجموع التراكمي الجاري، وأضف عدد مرات ظهور القيمة المطلوبة، ثم سجّل المجموع التراكمي الحالي. وينجز مرور واحد كل شيء.
total += x
count += seen[total - k]
seen[total] += 1لماذا يهم الترتيب
يجب أن تضيف إلى الإجابة قبل تسجيل المجموع التراكمي الحالي. وإلا فقد يتسلل نطاق طوله صفر، ويفسد العدّ.
مكسب السرعة
ينفّذ كل عنصر عملًا بزمن ثابت، لذا يُحسب العدد كله في O(n). وهذا يتفوق على الحل بالقوة الغاشمة ذي الزمن O(n تربيع) عند التعامل مع مدخلات كبيرة.
الأعداد السالبة مقبولة
بخلاف النوافذ المنزلقة، تتعامل هذه الطريقة مع الأعداد السالبة دون مشكلة، لأن فروق المجاميع التراكمية تظل صحيحة مهما كانت الإشارات.
حالة استخدام كلاسيكية
يحل هذا النمط مسألة مجموع المصفوفة الفرعية الذي يساوي k، إضافةً إلى كثير من التنويعات المقنّعة في أنظمة تحكيم المسابقات.
تحقق سريع
مجموعك التراكمي الجاري هو P والقيمة المستهدفة هي k.
مراجعة
يمكنك حساب عدد المصفوفات الفرعية ذات المجموع المستهدف في O(n) باستخدام المجاميع التراكمية وخريطة التكرارات. هيّئ المجموع التراكمي 0، ثم احسب العدد قبل التسجيل. ✅
الأسئلة الشائعة
هل درس «عدّ المصفوفات الفرعية ذات المجموع المستهدف» مجاني؟
نعم — نص درس «عدّ المصفوفات الفرعية ذات المجموع المستهدف» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Competitive Programming Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.
ماذا ستتعلم في «عدّ المصفوفات الفرعية ذات المجموع المستهدف»؟
دمج المجاميع السابقة مع خريطة تجزئة تتمرن على Competitive Programming Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Competitive Programming Academy؟
لا تُشترط خبرة سابقة. Competitive Programming Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «عدّ المصفوفات الفرعية ذات المجموع المستهدف»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Competitive Programming Academy هذا؟
نعم. كل درس في Competitive Programming Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إنشاء مصفوفة المجاميع السابقة
- جمع أي نطاق بالطرح
- عدّ المصفوفات الفرعية ذات المجموع المستهدف
- مصفوفات الفروق لتحديثات النطاق