最小K个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
eg 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
eg 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]
限制:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
思路
利用堆排序:建立并维持一个只有k个元素的最大堆,后面的元素进来时先与堆顶元素进行比较,如果比堆顶元素大,则不放进去;如果比堆顶元素小,则删掉堆顶元素,将次元素入堆,对整个堆重新进行排序,当着n个数都遍历完后,此时堆中元素便是最小的k个元素
import java.util.ArrayList;
2 import java.util.Comparator;
3 import java.util.PriorityQueue;
4 public class Solution {
5 public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
6 ArrayList<Integer>result=new ArrayList<Integer>();
7 int n=input.length;
8 if(k>n||k==0) return result;
9 PriorityQueue<Integer>maxHeap=new PriorityQueue<Integer>(k,new Comparator<Integer>(){
10 @Override
11 public int compare(Integer o1,Integer o2){
12 return o2.compareTo(o1);
13 }
14 });
15 for(int i=0;i<n;i++){
16 if(maxHeap.size()!=k){
17 maxHeap.offer(input[i]);
18 }else if(maxHeap.peek()>input[i]){
19 Integer tmp=maxHeap.poll();
20 tmp=null;
21 maxHeap.offer(input[i]);
22 }
23 }
24 for(Integer integer:maxHeap){
25 result.add(integer);
26 }
27 return result;
28 }
29 }