Introduction#
Sliding window is an algorithmic technique used to calculate occurrences or accumulations within a range.
There are several types of sliding window problems, such as fixed-size windows and two-pointer expand/shrink patterns.
Core Idea#
Most sliding window problems provide a fixed window size and define a target condition that must be satisfied within that frame, for example, calculating the maximum sum in a fixed-size window.
We need to move the window from left to right and track the maximum accumulation along the way.
Template#
Fixed Window Size#
Use Cases:#
- max/min array sum
- avg value
- max value in frame
def fixed window(nums, k):
  window_sum = sum(nums[:k])
  res = window_sum
  for i in range(k, len(nums)):
    window_sum += nums[i] - nums[i - k]
    res = max(res, window_size)
Mutable Window Size (Two Pointers)#
Use Cases:#
- character occurrence frequency
- distinct count / at most k
def variable_window(s):
  left = res = 0
  counter = defaultdict(int)
  for right in range(len(s)):
    counter[s[right]] += 1
    while condition_not_satisfied(counter):
      counter[s[left]] -= 1
      left += 1
    res = max(res, right - left + 1)
  return res
Sliding Window + Character Frequency#
Use Cases:#
- character sorting
- character frequency
def check_inclusion(s1, s2):
  if len(s1) > len(s2):
    return False
  target = Counter(s1)
  window = Counter(s2[:len(s1)])
  if target == window:
    return True
  for i in range(len(s1), len(s2)):
    window[s2[i]] += 1
    window[s2[i - len(s1)]] -= 1
    if windows[s2[i - len(s1)]] == 0:
      del windows[s2[i - len(s1)]]
    if window == target:
      return True
  return False
Sliding Window + Deque#
Use Cases:#
- max/min value in sliding frame
def maxSlidingWindow(nums, k):
  dq = deque()
  res = []
  for i in range(len(nums)):
    if dq and dq[0] <= i - k:
      dq.popleft()
    while dq and nums[dq[-1]] < nums[i]:
      dq.pop()
    dq.append(i)
    if i - k + 1 >= 0:
      res.append(nums[dq[0]])
  return res

