website/content.en/ChapterFour/0200~0299/0239.Sliding-Window-Maximum.md
Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position. Return the max sliding window.
Example:
Input: nums = [1,3,-1,-3,5,3,6,7], and k = 3
Output: [3,3,5,5,6,7]
Explanation:
Window position Max
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
Note:
You may assume k is always valid, 1 ≤ k ≤ input array's size for non-empty array.
Follow up:
Could you solve it in linear time?
Given an array nums, there is a sliding window of size k moving from the far left of the array to the far right. You can only see the numbers inside the sliding window k. The sliding window moves right by one position each time. Return the maximum values in the sliding window.
package leetcode
// Solution 1: Brute force O(nk)
func maxSlidingWindow1(a []int, k int) []int {
res := make([]int, 0, k)
n := len(a)
if n == 0 {
return []int{}
}
for i := 0; i <= n-k; i++ {
max := a[i]
for j := 1; j < k; j++ {
if max < a[i+j] {
max = a[i+j]
}
}
res = append(res, max)
}
return res
}
// Solution 2: Double-ended queue Deque
func maxSlidingWindow(nums []int, k int) []int {
if len(nums) == 0 || len(nums) < k {
return make([]int, 0)
}
window := make([]int, 0, k) // store the index of nums
result := make([]int, 0, len(nums)-k+1)
for i, v := range nums { // if the left-most index is out of window, remove it
if i >= k && window[0] <= i-k {
window = window[1:len(window)]
}
for len(window) > 0 && nums[window[len(window)-1]] < v { // maintain window
window = window[0 : len(window)-1]
}
window = append(window, i) // store the index of nums
if i >= k-1 {
result = append(result, nums[window[0]]) // the left-most is the index of max value in nums
}
}
return result
}