Sliding Window — Algoritma

Sliding Window menggunakan "jendela" yang bergeser sepanjang array untuk menghitung sesuatu secara efisien, tanpa menghitung ulang seluruh window. Dari O(n ×…

Sliding Window menggunakan "jendela" yang bergeser sepanjang array untuk menghitung sesuatu secara efisien, tanpa menghitung ulang seluruh window.

Dari O(n × k) jadi O(n)!

Fixed-size window:

// Cari jumlah terbesar dari k elemen berturut-turut
function maxSumSubarray(arr, k) {
  // Hitung sum window pertama
  let windowSum = 0;
  for (let i = 0; i < k; i++) {
    windowSum += arr[i];
  }

  let maxSum = windowSum;

  // Geser window: tambah elemen baru, buang elemen lama
  for (let i = k; i < arr.length; i++) {
    windowSum += arr[i] - arr[i - k]; // Slide!
    maxSum = Math.max(maxSum, windowSum);
  }

  return maxSum;
}

maxSumSubarray([2, 1, 5, 1, 3, 2], 3); // 9 (5+1+3)

Variable-size window:

// Substring terpendek yang mengandung sum ≥ target
function minSubarrayLen(target, arr) {
  let left = 0;
  let sum = 0;
  let minLen = Infinity;

  for (let right = 0; right < arr.length; right++) {
    sum += arr[right];

    while (sum >= target) {
      minLen = Math.min(minLen, right - left + 1);
      sum -= arr[left];
      left++; // Shrink window
    }
  }

  return minLen === Infinity ? 0 : minLen;
}

minSubarrayLen(7, [2, 3, 1, 2, 4, 3]); // 2 → [4, 3]

Kapan pakai Sliding Window?

🎭 Analogi sehari-hari: Lihat film lewat jendela kereta yang bergerak. Sebagian frame masuk dari kanan (right pointer), sebagian keluar dari kiri (left pointer). Kamu gak ngitung ulang seluruh pemandangan setiap detik — cuma update yang masuk dan keluar. Itu inti sliding window: incremental update, bukan recompute.

💡 Mengapa Sliding Window cepat? Brute force = untuk setiap window posisi, hitung dari awal = O(n × k). Sliding = setiap geser cuma 1 add + 1 remove = O(1) per geser. Total O(n). Hilangin nested loop dengan reuse hasil sebelumnya.

⚠️ Jebakan umum:

🎯 Pola "ini sliding window":

🧪 Tebakan cepat: Max sum 3 elemen berturut dari [1,4,2,10,2,3,1,0,20]. Brute: untuk tiap i, sum 3 elemen = O(nk) = 27 ops. Sliding: 9 + 7 update = ~16 ops. Speedup makin besar untuk k besar.

TL;DR: Sliding Window = window geser dengan incremental update. Ubah O(nk) jadi O(n). Pakai untuk subarray/substring berturut-turut. Fixed-size atau variable-size pattern.

Yang akan kamu pelajari