Sliding Window Maximum

Doyeon Kim·2022년 12월 15일

코딩테스트 공부

목록 보기
152/171

https://leetcode.com/problems/sliding-window-maximum/description/

주어진 nums와 범위k가 주어졌을 떄 주어진 범위 내 가장 큰 숫자들을 모아 반환하는 문제이다.

먼저 주어진 범위를 일일이 탐색하는 brute Force 방식이 있지만

nums = [1,3,-1,-3,5,3,6,7], k = 3 를 예로들면

[1,3,-1]을 탐색하고 다음으로 [3,-1,-3]을 탐색할때 3,-1은 이미 탐색하였기 떄문에 이런식으로 탐색한다면 비효율적이다.

두번쨰 방식으로 deque를 이용히는 방식이 있다.

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        res = []
        l, r = 0,0
        deq = collections.deque()

        while r< len(nums):
            while deq and nums[deq[-1]]<nums[r]:
                deq.pop()
            deq.append(r)
            if l >deq[0]:
                deq.popleft()
            if(r+1)>=k:
                res.append(nums[deq[0]])
                l+=1
            r+=1

        return res

Ex.[8,7,6,9] k=2를 예로들면

deque에 8을 우선 저장하고 이후에 7은 8보다 작기때문에 deque에 저장한다 deque=[8,7]
그리고 deque의 가장 왼쪽에 있는 8을 res에 append해준다.
그리고 다음 범위인 [7,6]을 봤을 때 범위를 지나친 8을 pop해주고 6이 7보다 작기때문에 6을 append해준다 [7,6]
그렇게 deq[0]에 범위 내 가장 큰 수를 남겨두고...
.
.
[6,9]를 보면 9는 6보다 크기때문에 6을 내보내고 9를 deque에 저장한다..

시간복잡도 o(n)

profile
성장하고 도전하는 개발자. 프로그래밍 좋아하세요?

0개의 댓글