טכניקות אלגוריתמיותבינוני8 דק׳ קריאה

שני מצביעים וחלון גולש - הטכניקות הכי שכיחות בראיונות

שתי טכניקות עוצמתיות על מערכים ומחרוזות שחוזרות בעשרות שאלות LeetCode - עם דוגמאות קוד ותבניות.

Two Pointers ו-Sliding Window הן שתי טכניקות שמשפרות פתרונות נאיביים מ-O(n²) ל-O(n). הן מופיעות בעשרות שאלות ראיון נפוצות ב-LeetCode, Google, Meta ו-Amazon - וכדאי לזהות אותן מהר.

Two Pointers - שני מצביעים שזזים

ממקמים שני מצביעים (בדרך כלל בשתי קצוות המערך) והזזים אותם לקראת אחד השני על פי תנאי. עובד על מערכים ממוינים ובעיות סימטריות.

// בעיה: האם יש זוג שמסכם ל-target? (מערך ממוין)
function twoSum(arr, target) {
  let left = 0, right = arr.length - 1;
  while (left < right) {
    const sum = arr[left] + arr[right];
    if (sum === target) return [left, right];
    else if (sum < target) left++;
    else right--;
  }
  return null;
}
// O(n) זמן, O(1) זיכרון - במקום O(n²) נאיבי

דוגמאות נוספות ל-Two Pointers

  • בדיקת Palindrome - שני מצביעים מהקצוות לפנים
  • Container With Most Water - מזיזים את הצד הנמוך יותר
  • Remove Duplicates from Sorted Array - מצביע כותב ומצביע קורא
  • 3Sum - קיבוע איבר אחד + Two Pointers על השאר

Sliding Window - חלון גולש

Sliding Window מתאים לבעיות על subarray או substring רציפים. במקום לחשב כל תת-מערך מחדש, שומרים 'חלון' ומעדכנים רק את הקצוות שמשתנים.

חלון בגודל קבוע

// בעיה: סכום מקסימלי של תת-מערך באורך k
function maxSumSubarray(arr, k) {
  let sum = arr.slice(0, k).reduce((a, b) => a + b, 0);
  let max = sum;
  for (let i = k; i < arr.length; i++) {
    sum += arr[i] - arr[i - k]; // הוסף מימין, הסר משמאל
    max = Math.max(max, sum);
  }
  return max;
}
// O(n) במקום O(n·k) נאיבי

חלון בגודל משתנה

// בעיה: substring ארוכה ביותר ללא אותיות חוזרות
function lengthOfLongestSubstring(s) {
  const seen = new Map();
  let left = 0, max = 0;
  for (let right = 0; right < s.length; right++) {
    if (seen.has(s[right]) && seen.get(s[right]) >= left) {
      left = seen.get(s[right]) + 1; // כווץ חלון
    }
    seen.set(s[right], right);
    max = Math.max(max, right - left + 1);
  }
  return max;
}

איך לזהות את הטכניקה הנכונה?

סימן בשאלהטכניקה
מערך ממוין, חיפוש זוג/שלישייהTwo Pointers מהקצוות
מחרוזת/מערך, subarray/substring רציףSliding Window
'תת-מערך עם סכום X', 'substring ארוכה ביותר'Sliding Window
Palindrome, ביטול איברים מסביב לצירTwo Pointers נפגשים

ברוב בעיות ה-Sliding Window: הרחב את החלון ימינה בכל שלב, וכווץ משמאל כשהתנאי מופר. זו התבנית שחוזרת בעשרות שאלות.

שאלות נפוצות

מתי משתמשים בטכניקת שני מצביעים?

כשעובדים על מערך ממוין או מחרוזת וצריך למצוא זוג או תת-מקטע המקיים תנאי. במקום שתי לולאות מקוננות ב-O(n²), מציבים מצביע בכל קצה ומקרבים אותם פנימה לפי התנאי — למשל בחיפוש זוג שסכומו נתון, מקדמים את המצביע השמאלי אם הסכום קטן מדי ואת הימני אם הוא גדול מדי. התוצאה היא O(n).

מה זה חלון גולש ואיך הוא עובד?

חלון גולש שומר על תת-מקטע רציף של המערך באמצעות שני אינדקסים. מרחיבים את החלון ימינה ומוסיפים איברים כל עוד התנאי מתקיים, ומכווצים אותו משמאל כשהוא מופר. כל איבר נכנס ויוצא לכל היותר פעם אחת, ולכן הסיבוכיות היא O(n) במקום O(n²) של בדיקת כל תתי-המקטעים.

מה ההבדל בין חלון בגודל קבוע לחלון בגודל משתנה?

בחלון בגודל קבוע k מזיזים את שני הקצוות יחד ומעדכנים את הסכום או המונה בהפרש בלבד — מתאים לשאלות כמו סכום מקסימלי של k איברים רצופים. בחלון בגודל משתנה הקצה הימני מתרחב והשמאלי מתכווץ לפי תנאי — מתאים לשאלות כמו תת-המחרוזת הארוכה ביותר ללא תווים חוזרים.

מאמרים קשורים

ויזואליזציה של אלגוריתמי מיוןלכל המאמרים