Top k Largest Numbers II

Implement a data structure, provide two interfaces:

  1. add(number). Add a new number in the data structure.
  2. topk(). Return the top k largest numbers in this data structure. k is given when we create the data structure.
Example
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]
PriorityQueue對元素採用的是堆排序,頭是按指定排序方式的最小元素。堆排序只能保證根是最大(最小),整個堆並不是有序的。
方法iterator()中提供的迭代器可能只是對整個數組的依次遍歷。也就只能保證數組的第一個元素是最小的。

java
public class Solution {
    /*
    * @param k: An integer
    */
    Comparator<Integer> cmp = new Comparator<Integer>() {
        public int compare(Integer a, Integer b) {
            return a - b;
        }
    };
    PriorityQueue<Integer> heap = null;
    int k = 0;
    public Solution(int k) {
        // do intialization if necessary
        heap = new PriorityQueue<Integer>();
        this.k = k;
    }

    /*
     * @param num: Number to be added
     * @return: nothing
     */
    public void add(int num) {
        // write your code here
        if (heap.size() < k) {
            heap.offer(num);
        } else if (heap.size() >= k && num > heap.peek()) {
            heap.poll();
            heap.offer(num);
        }
    }

    /*
     * @return: Top k element
     */
    public List<Integer> topk() {
        // write your code here
        List<Integer> list = new ArrayList<>();
        Iterator<Integer> it = heap.iterator();
        while (it.hasNext()) {
            list.add(it.next());
        }
        Collections.sort(list, Collections.reverseOrder());
        return list;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章