Algorithm // 최대-최소값을 트래킹 가능한 deque

Alpha, Orderly·2024년 12월 14일

aLGORITHM

목록 보기
1/3
class MinMaxTracker:
    def __init__(self):
        self.data = deque()  # 실제 데이터를 저장하는 데큐
        self.max_deque = deque()  # 현재 배열에서 최댓값을 관리하는 데큐
        self.min_deque = deque()  # 현재 배열에서 최솟값을 관리하는 데큐

    def append(self, value):
        self.data.append(value)

        # 최댓값 갱신 로직:
        # 새 값보다 작은 값들은 max_deque에서 제거 (이 값들은 더 이상 최댓값 후보가 될 수 없음).
        while self.max_deque and self.max_deque[-1] < value:
            self.max_deque.pop()
        self.max_deque.append(value)

        # 최솟값 갱신 로직:
        # 새 값보다 큰 값들은 min_deque에서 제거 (이 값들은 더 이상 최솟값 후보가 될 수 없음).
        while self.min_deque and self.min_deque[-1] > value:
            self.min_deque.pop()
        self.min_deque.append(value)

    def popleft(self):
        if not self.data:
            return -1  # 비어 있는 경우 -1 반환

        value = self.data.popleft()

        # 제거된 값이 현재 최댓값이면 max_deque에서도 제거
        if self.max_deque[0] == value:
            self.max_deque.popleft()

        # 제거된 값이 현재 최솟값이면 min_deque에서도 제거
        if self.min_deque[0] == value:
            self.min_deque.popleft()

    def get_max(self):
        # 현재 최댓값을 반환. 비어 있는 경우 -1 반환
        if not self.max_deque:
            return -1
        return self.max_deque[0]

    def get_min(self):
        # 현재 최솟값을 반환. 비어 있는 경우 -1 반환
        if not self.min_deque:
            return -1
        return self.min_deque[0]
profile
만능 컴덕후 겸 번지 팬

0개의 댓글