###### tags: `Leetcode` `hard` `sliding window` `python` `Top 100 Liked Questions`
# 239. Sliding Window Maximum
## [題目連結:] https://leetcode.com/problems/sliding-window-maximum/
## 題目:
You are given an array of integers ```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 1:**
```
Input: nums = [1,3,-1,-3,5,3,6,7], 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
```
**Example 2:**
```
Input: nums = [1], k = 1
Output: [1]
```
## 解題想法:
* 題目為給一个數组、給了一个窗口大小k,每次向右滑動一个數字,求每次返回窗口内的數字中最大值。
* 解法可參考[1696. Jump Game VI](/g8JzXBXTRROo2DgG5xwxaQ) 思路
* 使用queue:
* 目的為:
* 存pos
* que中位置對應到的nums值,呈現遞減
* **step1:** 每次先判斷que中的位置,是否已經不在window size內的合理範圍,若不再則需popleft()
* **step2:** 將que尾中位置的nums值,與當前nums[i]比較,若比當前小,則pop()
* **step3:** 將當前i存入que
* **step4:** 最後res每次存入nums[que[0]]即可
* 因為que[0]一定是當前window size內nums之最大值
## Python:
``` python=
from collections import deque
class Solution(object):
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
res=[]
que=deque() #存位置
#讓que中位置對應到的nums值,呈現遞減
for i in range(len(nums)):
#若que中最先進的位置已經不符合window size,則popleft
#ex: que=[0,1,2,3] i=4, k=3
#因為i一定要加入,當前判斷為2,3,4所以0,1需要pop
while que and que[0]<=i-k:
que.popleft()
#若前輩比當前nums[i]小,淘汰
while que and nums[que[-1]]<=nums[i]:
que.pop()
que.append(i)
if i>=k-1:
res.append(nums[que[0]])
return res
if __name__=='__main__':
result=Solution()
ans=result.maxSlidingWindow(nums = [1,3,-1,-3,5,3,6,7], k = 3)
print(ans) #[3, 3, 5, 5, 6, 7]
```