⚠ This page is served via a proxy. Original site: https://github.com
This service does not collect credentials or authentication data.
Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions other/sliding_window_maximum.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from collections import deque


def sliding_window_maximum(numbers: list[int], window_size: int) -> list[int]:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the difference between this and maths/max_sum_sliding_window.py?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @poyea, thanks for the review!

Great question — these two are related (both use sliding window idea), but they solve completely different problems:

  • maths/max_sum_sliding_window.py finds the maximum sum of any single window of size k → returns one integer (the largest possible sum among all k-sized subarrays). It uses a simple running sum technique.

  • My PR adds other/sliding_window_maximum.py which finds the maximum element in every sliding window of size k → returns a list of max values (one per window position). This is the classic "Sliding Window Maximum" problem (LeetCode 239), solved efficiently with a monotonic deque to track the current maximum in O(1) per step.

Example to show the difference:
Input: nums = [1, 3, -1, -3, 5, 3, 6, 7], k = 3

  • Your existing file would return the single max sum (e.g. max of 1+3+(-1)=3, 3+(-1)+(-3)=-1, etc. → probably 5+3+6=14)
  • My new file returns [3, 3, 5, 5, 6, 7] — the max element in each of the 6 overlapping windows

They have different outputs, different goals, and use different internal logic (deque vs simple sum update). No overlap/duplication — this adds a popular, missing hard problem from LeetCode/competitive programming.

Happy to make any adjustments or add more comments if needed!

"""
Return a list containing the maximum of each sliding window of size window_size.

This implementation uses a monotonic deque to achieve O(n) time complexity.

Args:
numbers: List of integers representing the input array.
window_size: Size of the sliding window (must be positive).

Returns:
List of maximum values for each valid window.

Raises:
ValueError: If window_size is not a positive integer.

Time Complexity: O(n) - each element is added and removed at most once
Space Complexity: O(k) - deque stores at most window_size indices

Examples:
>>> sliding_window_maximum([1, 3, -1, -3, 5, 3, 6, 7], 3)
[3, 3, 5, 5, 6, 7]
>>> sliding_window_maximum([9, 11], 2)
[11]
>>> sliding_window_maximum([], 3)
[]
>>> sliding_window_maximum([4, 2, 12, 3], 1)
[4, 2, 12, 3]
>>> sliding_window_maximum([1], 1)
[1]
"""
if window_size <= 0:
raise ValueError("Window size must be a positive integer")
if not numbers:
return []

result: list[int] = []
index_deque: deque[int] = deque()

for current_index, current_value in enumerate(numbers):
# Remove the element which is out of this window
if index_deque and index_deque[0] == current_index - window_size:
index_deque.popleft()

# Remove useless elements (smaller than current) from back
while index_deque and numbers[index_deque[-1]] < current_value:
index_deque.pop()

index_deque.append(current_index)

# Start adding to result once we have a full window
if current_index >= window_size - 1:
result.append(numbers[index_deque[0]])

return result