في هذا الجزء الثاني من سلسلتنا ، نغوص في واحدة من أكثر الأنماط تنوعا لحل أسئلة مقابلة الترميز: النافذة المنزلق. هذه التقنية مفيدة بشكل لا يصدق لتحسين المشكلات التي تنطوي على الطوائف الفرعية أو الفرعية للعناصر المتجاورة ، مثل تعظيم المبالغ ، أو إيجاد شروط محددة داخل التسلسل ، أو العمل مع السلاسل الفرعية.
قبل أن نبدأ ، إذا كنت تبحث عن دليل شامل للتحضير لمقابلات الترميز ، ففكر في التحقق من تكسير مقابلة الترميز ، وهو كتاب لا بد منه لأي شخص جاد بشأن هبوط وظيفة في شركات التكنولوجيا العليا.
نمط النافذة المنزلق هو تقنية تتيح لك حل المشكلات بكفاءة حيث تحتاج إلى النظر في مجموعة فرعية من البيانات من مجموعة بيانات أكبر (مثل جهاز فرعي من صفيف أو فرعية لسلسلة). بدلاً من إعادة حساب المجموعة الفرعية في كل مرة تقوم فيها بنقل النافذة ، تحافظ هذه التقنية على إجمالي أو شرط تشغيل ، أو ينزلق عبر البيانات لتقليل العمل غير الضروري.
مثال مشكلة : أعطيت مجموعة من الأعداد الصحيحة ورقم k ، ابحث عن الحد الأقصى للمجموع من أي سائق فرعي من الحجم k.
def max_sum_subarray(arr, k): # Initialize variables to store the maximum sum and the current window sum. max_sum = 0 window_sum = 0 # First, calculate the sum of the initial window (first 'k' elements). for i in range(k): window_sum = arr[i] # Set the max_sum to the initial window's sum. max_sum = window_sum # Now, slide the window across the array. # Start from the kth element and move until the end of the array. for i in range(k, len(arr)): # Slide the window by subtracting the element that is no longer in the window # (arr[i - k]) and adding the new element (arr[i]). window_sum = arr[i] - arr[i - k] # Update max_sum if the current window sum is greater than the previous max_sum. max_sum = max(max_sum, window_sum) # Return the maximum sum found. return max_sum
توضيح:
مثال مشكلة : أعطيت مجموعة من الأعداد الصحيحة ورقم S ، ابحث عن أصغر سفر فرعي متجاورة يكون مجموعه أكبر من أو يساوي s.
def smallest_subarray_with_sum(arr, S): # Initialize variables: # window_sum: to store the sum of the current window. # min_length: to store the length of the smallest subarray found. # window_start: the starting index of the sliding window. window_sum = 0 min_length = float('inf') # Start with a large number to compare minimum lengths. window_start = 0 # Iterate over the array with window_end being the right boundary of the window. for window_end in range(len(arr)): # Add the current element to the window_sum. window_sum = arr[window_end] # While the current window's sum is greater than or equal to S: while window_sum >= S: # Calculate the current window size and update min_length if smaller. min_length = min(min_length, window_end - window_start 1) # Shrink the window from the left by removing the element at window_start. window_sum -= arr[window_start] # Move the start of the window to the right. window_start = 1 # If min_length was updated, return it; otherwise, return 0 (meaning no valid subarray was found). return min_length if min_length != float('inf') else 0
توضيح:
حدد حدود النافذة : تحتاج إلى تحديد بداية ونهاية النافذة.
قم بتعيين حالة أولية : للنوافذ الثابتة ، قم بتهيئة المبلغ/المنتج/الشرط للنافذة الأولى. بالنسبة للنوافذ الديناميكية ، يعتمد الحالة الأولية على هدف المشكلة.
حرك النافذة :
تحقق من النتائج وتحديثها : بعد كل حركة نافذة ، قم بتحديث النتيجة (مثل الحد الأقصى للمبلغ ، الحد الأدنى للطول ، إلخ) حسب الضرورة.
أطول فرعية دون تكرار الأحرف
الحد الأقصى للمجموع الفرعي للحجم k
أصغر سفرًا بمجموع معين
فكر من حيث حدود النافذة : ابدأ بالتفكير في المكان الذي يجب أن تبدأ فيه النافذة وتنتهي. يساعدك هذا في تحديد النطاق الدقيق الذي تعمل معه.
استخدم hashmap أو تعيين لنظام التشغيل windows الديناميكية : عند التعامل مع السلاسل الفرعية أو العناصر الفريدة ، استخدم مجموعة لتتبع العناصر في النافذة.
ابدأ بالتعبير الغاشم ثم تحسين : في بعض المشكلات ، يمكن أن يساعدك في نهج القوة الغاشمة (مثل التحقق من كل سفر فرعي ممكن) في تصور كيف ستقلل نافذة المنزلقة من العمل غير الضروري.
: إذا كانت المشكلة تحتوي على مكون تحسين (مثل تقليل أو زيادة المبلغ أو الطول) ، فقد تكون النافذة المنزلق مناسبة جيدة.
خاتمة، وهي استراتيجية أخرى فعالة للغاية تكمل غالبًا نهج النافذة المنزلق في المشكلات التي تنطوي على أزواج أو مقارنات بين العناصر.
ترقبوا الجزء 3!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3