按照从小到大排序,取前K个数字。
- public List
getLeastK(List list, int k) { - list.sort(Comparator.naturalOrder());
- List
resultList = new ArrayList<>(k); - for (int i = 0; i < k; i++) {
- resultList.add(list.get(i));
- }
-
- return resultList;
- }
时间复杂度:O(n*logn)
维护一个长度为k的最大堆,每次将最大值弹出,遍历所有数字,最后堆里的数字就是最小的k个数字。
- public List
getLeastK(List list, int k) { - PriorityQueue
priorityQueue = new PriorityQueue<>(k, Comparator.reverseOrder()); - for (Integer integer : list) {
- if (priorityQueue.size() < k) {
- priorityQueue.offer(integer);
- } else {
- priorityQueue.offer(integer);
- priorityQueue.poll();
- }
- }
-
- List
resultList = new ArrayList<>(k); - while (!priorityQueue.isEmpty()) {
- resultList.add(priorityQueue.poll());
- }
-
- Collections.reverse(resultList);
- return resultList;
- }
时间复杂度:O(logn)