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.
정수 자료형 리스트와 슬라이딩 윈도우의 크기가 주어진다.
만들어질수 있는 모든 슬라이딩 윈도우 내부의 최댓값을 가지는 배열을 리턴하시오.
Input: nums = [1,3,-1,-3,5,3,6,7], k = 3
Output: [3,3,5,5,6,7]
Explanation:
윈도우 위치 최댓값
--------------- -----
[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
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
# 슬라이딩 윈도우의 크기가 1인 경우, 그냥 최댓값은 배열 자기 자신이나 마찬가지이다.
if k == 1: return nums
# 연산에 사용될 deque
dq = deque()
# 답이 저장될 곳
ans = []
# 첫번째 슬라이딩 윈도우를 만들고, 그 최댓값을 구해 넣는 과정
for i in range(k):
while dq and nums[dq[-1]] < nums[i]:
dq.pop()
dq.append(i)
ans.append(nums[dq[0]])
# 두번째 슬라이딩 윈도우부터 계산한다.
# left : 슬라이딩 윈도우에서 사라져야할 index의 위치 ( 왼쪽 )
for left in range(len(nums) - k):
# deque의 첫번째 index가 left와 일치하면 사라지는 부분이기에 제거
if left == dq[0]:
dq.popleft()
# 우측에 값을 추가하기 전에 추가되는 값보다 앞의 값이 작으면 pop 한다.
# dq가 비어있으면 멈추도록 dq를 조건식에 넣는다.
while dq and nums[dq[-1]] < nums[left+k]:
dq.pop()
# 오른쪽 값 추가
dq.append(left+k)
# 본 슬라이딩 윈도우의 최댓값을 append
ans.append(nums[dq[0]])
return ans