"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > مؤشران ونمط نافذة منزلقة

مؤشران ونمط نافذة منزلقة

تم النشر بتاريخ 2024-09-11
تصفح:200

Two Pointer and sliding window pattern

أنماط النوافذ ذات المؤشرين والنوافذ المنزلقة

النمط 1: نافذة ثابتة (مثل النافذة = 4 أو بعض القيم الصحيحة)

على سبيل المثال، في حالة وجود مجموعة من الأعداد الصحيحة (-ve و ve)، ابحث عن الحد الأقصى لمجموع النافذة المتجاورة بالحجم k.

النمط 2:(حجم النافذة المتغير) أكبر مصفوفة فرعية/سلسلة فرعية مع مثال : sum

  • النهج:
    • القوة الغاشمة: أنشئ جميع المصفوفات الفرعية الممكنة واختر المصفوفة الفرعية ذات الطول الأقصى بمجموع
  • بيتن/الأمثل: استفد من المؤشرين والنافذة المنزلقة لتقليل التعقيد الزمني إلى O(n)

النمط 3: عدد المصفوفة الفرعية/السلسلة الفرعية حيث مثل sum=k.
من الصعب جدًا حل هذه المشكلة لأنه يصبح من الصعب متى تتوسع (يمينًا) أو متى تتقلص (يسارًا).

يمكن حل هذه المشكلة باستخدام النمط 2
لحل مشاكل مثل العثور على عدد السلاسل الفرعية حيث sum =k.

  • يمكن تقسيم ذلك إلى

    • ابحث عن المصفوفات الفرعية حيث sum
    • ابحث عن المصفوفة الفرعية حيث مجموع

النمط 4: ابحث عن النافذة الأقصر/الحد الأدنى

أساليب مختلفة للنمط 2:
مثال: أكبر مصفوفة فرعية تحتوي على مجموع

public class Sample{
    public static void main(String args[]){
        n = 10;
        int arr[] = new int[n];

        //Brute force approach for finding the longest subarray with sum  k) break; /// optimization if the sum is greater than the k, what is the point in going forward? 
            }
        }

أسلوب أفضل باستخدام المؤشرين والنافذة المنزلقة

        //O(n n) in the worst case r will move from 0 to n and in the worst case left will move from 0 0 n as well so 2n
        int left = 0;
        int right =0;
        int sum = 0;
        int maxLen = 0;
        while(right k){
                sum = sum-arr[left];
                left  ;
            }
            if(sum 



المنهج الأمثل:
نحن نعلم أنه إذا وجدنا المصفوفة الفرعية فإننا نقوم بتخزين طولها في maxLen، ولكن أثناء إضافة arr[right] إذا أصبح المجموع أكثر من k، فإننا حاليًا نقوم بتقليص اليسار عن طريق فعل sum = sum-arr[left] والقيام باليسار.
نحن نعلم أن الحد الأقصى للطول الحالي هو maxLen، إذا واصلنا تقليص الفهرس الأيسر فقد نحصل على مصفوفة فرعية أخرى تحقق الشرط ( maxLen، ثم سيتم تحديث maxLen فقط.

سيكون النهج الأمثل هو تقليص اليسار فقط طالما أن طول المصفوفة الفرعية أكبر من maxLen عندما لا تستوفي المصفوفة الفرعية الشرط (

        int right =0;
        int sum = 0;
        int maxLen = 0;
        while(right k){// this will ensure that the left is incremented one by one (not till the sum




          

            
  

            
        

بيان الافراج تم نشر هذه المقالة على: https://dev.to/prashanrmishra/two-pointer-and-sliding-window-pattern-4118?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3