545. 전 K 대수 II

1708 단어
묘사 하 다.
하나의 데이터 구 조 를 실현 하고 다음 두 개의 인 터 페 이 스 를 제공 합 니 다.
본보기
s = new Solution(3);
>> create a new data structure.
s.add(3)
s.add(10)
s.topk()
>> return [10, 3]
s.add(1000)
s.add(-99)
s.topk()
>> return [1000, 10, 3]
s.add(4)
s.topk()
>> return [1000, 10, 4]
s.add(100)
s.topk()
>> return [1000, 100, 10]

사고의 방향
먼저 5. k 큰 요소 의 quick Select 방법 을 생각해 야 합 니 다. 그러나 본 문제 의 데 이 터 는 변화 하고 있 기 때문에 Priority Queue 방법 을 선택 하 십시오. 본 문 제 는 Priority Queue 의 전형 적 인 응용 입 니 다.
코드
add 의 시간 복잡 도 logK, top 의 시간 복잡 도 Klogk
public class Solution {
    //       
    private int maxSize;
    private Queue minheap;
    //    
    public Solution(int k) {
        //    
        minheap = new PriorityQueue<>();
        maxSize = k;
    }

    public void add(int num) {
        if (minheap.size() < maxSize) {
            minheap.offer(num);
            //    return       minheap.size() < maxSize        if   
            return;
        }
        
        //   minheap.size() == k    
        if (num > minheap.peek()) {
            minheap.poll();
            minheap.offer(num);
        }
    }
 
    //      k   ,  poll       logK,k     KlogK
    public List topk() {
        //         ,        ,   
        Iterator it = minheap.iterator();
        List result = new ArrayList();
        while (it.hasNext()) {
            result.add((Integer) it.next());
        }
        Collections.sort(result, Collections.reverseOrder());
        return result;
    }
}

[교체 기 관련]https://www.cnblogs.com/lxqiaoyixuan/p/7156944.html

좋은 웹페이지 즐겨찾기