Skip to content

239. Sliding Window Maximum

Intuition

The key concepts of the problem is to maintain a "MAX" list.

Approach

For each round, you need to remove the indexes from queue if the corresponding element in nums are smaller than curent number.

After remove all the smaller elements, append the current number to the queue.

Check the indexes in queue is in k range; otherwise, remove them.

Finally, take the first index in queue and append the corresponding number to the return slice from nums.

(queue will maintain a large to small list.)

Complexity

  • Time complexity: O(N)
  • Space complexity: O(k)

Keywords

  • Sliding Window
  • Array

Code

func maxSlidingWindow(nums []int, k int) []int {
    queue, ret := make([]int, 0), make([]int, 0)

    for i, num := range nums {
        for len(queue) > 0 && nums[queue[len(queue) - 1]] < num {
            queue = queue[: len(queue) - 1]
        }
        queue = append(queue, i)

        if queue[0] <= i - k {
            queue = queue[1:]
        }

        if i >= k - 1 {
            ret = append(ret, nums[queue[0]])
        }
    }

    return ret
}