[LeetCode] 239. Sliding Window Maximum

yunanยท2021๋…„ 2์›” 6์ผ
0
post-thumbnail

๐Ÿ”ฆ ๋ฌธ์ œ ๋งํฌ

๐Ÿ”Š ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐ๋ทฐ ์ฑ…์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ์ œ

์ •์ˆ˜ ์ˆซ์ž ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง€๊ณ  ๋ฐฐ์—ด์˜ ๋งจ ์™ผ์ชฝ์—์„œ ๋งจ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋Š” k ํฌ๊ธฐ์˜ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์—์„œ k ๊ฐœ์˜ ์ˆซ์ž ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๊ฐ€ ํ•œ ์œ„์น˜ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ์ตœ๋Œ€ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ๊ฐ’์„ ๋„ฃ์€ ๊ฐ’๋“ค์„ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”.

โœ๏ธ ํ’€์ด


leetcode discuss ์ฐธ๊ณ  ํ’€์ด

๋จผ์ € ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋กœ ์‚ฌ์šฉํ•  ํ๋ฅผ ์„ ์–ธํ•œ๋‹ค.
๋ฐฐ์—ด์„ ๋Œ๋ฉด์„œ ๋ชจ๋“  ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด ๋ฐ˜๋ณต์„ ์‹œ์ž‘ํ•œ๋‹ค.
1. ํ˜„์žฌ์ธ๋ฑ์Šค์˜ ์ˆซ์ž๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋ฅผ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์—์„œ ๋ชจ๋‘ ๋นผ๋‚ธ๋‹ค.
2. ํ˜„์žฌ์ธ๋ฑ์Šค๋ฅผ ์Šฌ๋ผ์ด๋”ฉ์œˆ๋„์šฐ(ํ)์— ์‚ฝ์ž…ํ•œ๋‹ค.
3. ๋งŒ์•ฝ, ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์ธ๋ฑ์Šค์™€ ํ˜„์žฌ ์ธ๋ฑ์Šค์˜ ์ฐจ์ด๊ฐ€ k๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด ์˜ค๋ž˜๋œ ์ธ๋ฑ์Šค๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
๋งˆ์ง€๋ง‰์— ์žˆ๋Š” i + 1 >= k๋Š” ์ฒ˜์Œ ์‹œ์ž‘ ์‹œ k๊ฐœ ์ด์ƒ์„ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋„ฃ์–ด๋ณด๊ณ  ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
4. ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์— ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊ฐ€ ํ•ญ์ƒ ํ˜„์žฌ ์œˆ๋„์šฐ์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋˜๋ฏ€๋กœ ๊ฒฐ๊ณผ์— ์‚ฝ์ž…ํ•œ๋‹ค.

๐Ÿ›  ์ฝ”๋“œ


# leet code solution (Very GOOD)
from collections import deque
class Solution:
    def maxSlidingWindow(self, nums, k):
        res = []
        bigger = deque()
        for i, n in enumerate(nums):
            # make sure the rightmost one is the smallest
            while bigger and nums[bigger[-1]] <= n:
                bigger.pop()

            # add in
            bigger += [i]

            # make sure the leftmost one is in-bound
            if i - bigger[0] >= k:
                bigger.popleft()

            # if i + 1 < k, then we are initializing the bigger array
            if i + 1 >= k:
                res.append(nums[bigger[0]])
        return res
  • ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ
# book solution ์‹œ๊ฐ„์ดˆ๊ณผ
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        results = []
        window = collections.deque()
        current_max = float('-inf')
        for i, v in enumerate(nums):
            window.append(v)
            if i < k - 1:
                continue

            # ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ฐ’์ด ๊ธฐ์กด ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ ๊ต์ฒด
            if current_max == float('-inf'):
                current_max = max(window)
            elif v > current_max:
                current_max = v

            results.append(current_max)

            # ์ตœ๋Œ€๊ฐ’์ด ์œˆ๋„์šฐ์—์„œ ๋น ์ง€๋ฉด ์ดˆ๊ธฐํ™”
            if current_max == window.popleft():
                current_max = float('-inf')
        return results

๐Ÿ“ ์ •๋ฆฌ


๐ŸŽˆ ์ฐธ๊ณ 


Book ๋งํฌ

profile
Go Go

0๊ฐœ์˜ ๋Œ“๊ธ€