difficulty: Medium tags:

  • Priority Queue
  • Heap
  • Data Stream title: Top k Largest Numbers II

Top k Largest Numbers II

Problem

Metadata

Description

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

  1. s = new Solution(3);
  2. >> create a new data structure.
  3. s.add(3)
  4. s.add(10)
  5. s.topk()
  6. >> return [10, 3]
  7. s.add(1000)
  8. s.add(-99)
  9. s.topk()
  10. >> return [1000, 10, 3]
  11. s.add(4)
  12. s.topk()
  13. >> return [1000, 10, 4]
  14. s.add(100)
  15. s.topk()
  16. >> return [1000, 100, 10]

题解

此题只用堆的话在最后的排序输出会比较难受,最后用 List 的排序也可以。

Java

  1. public class Solution {
  2. private int k = -1;
  3. private Queue<Integer> heap = null;
  4. /*
  5. * @param k: An integer
  6. */public Solution(int k) {
  7. // do intialization if necessary
  8. this.k = k;
  9. heap = new PriorityQueue<Integer>(k);
  10. }
  11. /*
  12. * @param num: Number to be added
  13. * @return: nothing
  14. */
  15. public void add(int num) {
  16. // write your code here
  17. if (heap.size() < k) {
  18. heap.offer(num);
  19. } else if (heap.peek() < num) {
  20. heap.poll();
  21. heap.offer(num);
  22. }
  23. }
  24. /*
  25. * @return: Top k element
  26. */
  27. public List<Integer> topk() {
  28. // write your code here
  29. List<Integer> result = new ArrayList<>(k);
  30. Iterator<Integer> it = heap.iterator();
  31. while(it.hasNext()) {
  32. result.add(it.next());
  33. }
  34. result.sort(Collections.reverseOrder());
  35. return result;
  36. }
  37. }

源码分析

复杂度分析