プログラマデュアル優先キュー


にじゅうゆうせんれつ
問題の説明
デュアル・ユーティリティ・プリアンブル・キューとは、次の演算が可能なデータ構造です.
コマンド受信タワー(高さ)Iのデジタルキューに指定した数字を挿入します.D 1キューから最値を削除します.D-1キューから最大値を削除します.
パラメータとして2つの優先順位キューで実行する演算操作を指定した場合、すべての演算を処理した後、キューが空の場合[0,0]空でない場合、「最値、最上昇値」を返すソルバを実装します.
せいげんじょうけん
  • 操作は、100000より長い文字列配列である.
  • 操作の要素は、キューが実行する操作を表す.
    要素はコマンドデータ形式で与えられます.最大値/最大値を削除する操作で複数の最大値/最大値がある場合は、1つだけ削除します.
  • 空のキューでデータの削除が要求された場合、この操作は無視されます.
  • I/O例
    operationsreturn["I 16","D 1"][0,0]["I 7","I 5","I -5","D -1"][7,5]
    I/O例説明
    16を挿入すると、最大値が削除されます.[0,0]を返します.空ですから.
    7、5、および-5を挿入して、最大値を削除します.最大値7、最小値5を返します.
    concept
    just do it .. 要求通りに記入すればいいです.
    code
    にじゅうゆうせんれつ
    import heapq
    def solution(operations):
        answer = []
        heap = []
        
        for i in operations:
            #명령어 I 처리
            if i[0] == 'I':
                heapq.heappush(heap, int(i[2:]))
            #명령어 D 처리
            else:
                if len(heap)==0:
                    continue
                elif i[2] == '-':
                    heapq.heappop(heap)
                else:
                    #heap에서 가장 큰 수 제거
                    #heapq.nlargest(n, list) 함수를 사용하면 list에서 가장 큰 n개의 수를 뽑아 낼 수 있다. 위 코드에서 heap                     의 원소 개수만큼 뽑아 내기 때문에 heap 리스트는 내림 차순으로 정렬이 되어 있는 상태이다. 이 상태에서 1부터                     슬라이싱을 하면 가장 큰 최대값이 제외될 것이고, 다시 최소힙으로 만들어주면 된다.
                    heap = heapq.nlargest(len(heap),heap)[1:]
                    #다시 힙정렬
                    heapq.heapify(heap)
        if heap:
            answer.append(max(heap))
            answer.append(min(heap))
        else:
            answer.append(0)
            answer.append(0)
                
        return answer
    import heapq
    def solution(operations):
        answer = []
        heap = []
        for op in operations:
            if(op[0] == 'I'):
                heapq.heappush(heap,int(op[2:]))
            else:
                if(len(heap) == 0):
                    continue
                elif(op[2] == '-'):
                    heapq.heappop(heap)
                else:
                    heap.pop()
        if(heap):
            answer.append(max(heap))
            answer.append(min(heap))
        else:
            return [0,0]
        return answer
    リファレンス
    #heapから最大数を削除...->heap.pop()でも...
    Pythonは本当に自分でスタック構造を整理しているようです...△この部分については、後で詳しく説明します.