(五)top k大的数目

一、问题

在一个很长的数组中,求出top k大小的数目

二、办法

  • 用优先队列
  • 时间复杂度O(nlog(k)),应该是最差的情况下是这个

三、Code

 1 package algorithm;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Comparator;
 5 import java.util.List;
 6 import java.util.PriorityQueue;
 7 
 8 /**
 9  * Created by adrian.wu on 2019/2/18.
10  */
11 public class TopKNums {
12     public List<Integer> topKnums(int[] nums, int k) {
13         PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
14             @Override
15             public int compare(Integer o1, Integer o2) {
16                 return o2.compareTo(o1);
17             }
18         });
19         for (int i = 0; i < k; i++)
20             pq.add(nums[i]);
21 
22         for (int i = k; i < nums.length; i++) {
23             if (pq.peek() != null && pq.peek() > nums[i]) {
24                 pq.poll();
25                 pq.offer(nums[i]);
26             }
27         }
28 
29         List<Integer> list = new ArrayList<>();
30         while (pq.peek() != null) list.add(pq.poll());
31         return list;
32     }
33 }

猜你喜欢

转载自www.cnblogs.com/ylxn/p/10394629.html