239. Sliding Window Maximum

1. Description

  • 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.

2. Example

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]

3. Solution

  • Runtime: 179
  • Time Complexity: O(N)
  • ์„ค๋ช…
    • deque๋ฅผ ๋งŒ๋“ ๋‹ค.
      • ๐Ÿ“Œdeque๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์š”์†Œ๋“ค์„ ์ œ๊ฑฐํ•˜๊ณ  ์œ ํšจํ•œ ์ตœ๋Œ€๊ฐ’๋งŒ ๋‚จ๊ฒจ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์ธ๋‹ค.
      • ๐Ÿ“Œdeque์— ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•œ ์ด์œ 
        • window ๋ฒ”์œ„ ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
        • nums[q[0]](์œˆ๋„์šฐ์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์˜ ์ธ๋ฑ์Šค๋ฅผ ์˜๋ฏธ)์„ ํ†ตํ•ด ์ตœ๋Œ€๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•จ์ด๋‹ค.
    • r์ด len(nums)๊นŒ์ง€ ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ์‹คํ–‰ํ•œ๋‹ค.
    • ํ˜„์žฌ ์š”์†Œ๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์€ ๋ฑ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
      • q๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๊ณ  nums[q[-1]] < nums[r]์ผ ๋•Œ
      • q[-1]์€ ํ˜„์žฌ ๋ฑ์—์„œ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ์ธ๋ฑ์Šค์ด๋‹ค.
      • ๋งŒ์•ฝ ํ˜„์žฌ ์ˆซ์ž(nums[r])๊ฐ€ ๋ฑ์˜ ๋งˆ์ง€๋ง‰ ์ˆซ์ž(nums[q[-1]])๋ณด๋‹ค ํฌ๋‹ค๋ฉด
        • ๋ฑ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
    • deque์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด ์œˆ๋„์šฐ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ œ๊ฑฐํ•œ๋‹ค.
      • q[0]์€ ํ˜„์žฌ ๋ฑ์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ฐ€์ง„ ์ธ๋ฑ์Šค์ด๋‹ค.
      • q[0]์ด ํ˜„์žฌ ์œˆ๋„์šฐ ๋ฒ”์œ„( l ~ r ) ๋ฐ–์— ์—†๋‹ค๋ฉด ์ œ๊ฑฐ
    • ์œˆ๋„์šฐ ํฌ๊ธฐ๊ฐ€ k์ด์ƒ์ด๋ฉด ์ตœ๋Œ€๊ฐ’ ์ €์žฅ
      • (r + 1) >= k: ์œˆ๋„์šฐ ํฌ๊ธฐ ์ฆ‰ r์ด k์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ, nums[q[0]]์„ result์— ์ถ”๊ฐ€ํ•œ๋‹ค.
      • ๐Ÿ“Œq[0]์€ ํ˜„์žฌ ์œˆ๋„์šฐ์—์„œ ์ตœ๋Œ€๊ฐ’์˜ ์ธ๋ฑ์Šค์ด๋ฏ€๋กœ nums[q[0]]์ด ์ตœ๋Œ€๊ฐ’.
      • ๐Ÿ“Œl์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์ด์œ 
        • l์€ ์œˆ๋„์šฐ ํฌ๊ธฐ k๊ฐ€ ์œ ์ง€๋œ ์ดํ›„์—๋งŒ ์ฆ๊ฐ€์‹œ์ผœ์•ผ ํ•œ๋‹ค.
        • r์ด ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ์œˆ๋„์šฐ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  k์— ๋„๋‹ฌํ•˜๋ฉด l์„ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ๊ทธ๋‹ค์Œ r์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ตฌ์กฐ์ด๋‹ค.
    • r๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ r์ด k์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        result = []
        left = right = 0
        q = deque()
 
        while right < len(nums):
            # print("deque = ", q)
            # print("result = ", result)
            while q and nums[q[-1]] < nums[right]:
                q.pop()
            q.append(right)
 
            if left > q[0]:
                q.popleft()
            
            if (right + 1) >= k:
                result.append(nums[q[0]])
                left += 1
            right += 1
        return result
  • ๐Ÿ“Œdeque๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
    • ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋ฏ€๋กœ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ๋Š”๋ฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋งŽ์ด ์•ˆ์žก์•„๋จน์„๊ฑฐ ๊ฐ™๋‹ค.

4. What I Learned

References