题解 | #最小的K个数#
最小的K个数
https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf
import java.util.*; public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution (int[] input, int k) { if(k==0||input.length==0){ return new ArrayList<Integer>(); } int[] temp = new int[k]; Arrays.sort(input); ArrayList<Integer> res = new ArrayList<Integer>(); for(int i=0;i<k;++i){ res.add(input[i]); } return res; } }
方法一:使用库函数sort
这个是第一时间能想到的,先将数组利用Arrays的sort方法排序,然后取前k个数即可。
方法二:堆排序
堆分为小根堆和大根堆,顾名思义就是小的在上或者大的在上。Java中提供了优先队列容器,容器内部的次序是基于堆排序的,每进入一个元素都会按堆排序重新排序,取出的元素永远是堆顶元素,即此堆的最大或最小值。
利用这种特性,我们可以建造一个容量为k的大顶堆,每当有较小值出现就替换堆顶值,内部会自动重排序,待所有元素比较结束后,堆中就是最小的四个元素。
步骤:
1、构建大小为k的大顶堆,为数组的前k个元素构成
2、遍历数组,将每个值与堆顶比较,小的入堆
3、堆元素进入数列
import java.util.*; public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution (int[] input, int k) { ArrayList<Integer> res = new ArrayList<Integer>(); if (k == 0 || input.length == 0) { return res; } //声明一个大根堆,用了lambda表达式实现 PriorityQueue<Integer> q = new PriorityQueue<>((o1, o2)->o2.compareTo(o1)); //构建一个大小为k的堆 for (int i = 0; i < k; ++i) { q.offer(input[i]);//数组的前k个值入队 } //遍历比较后面的元素 for (int i = k; i < input.length; ++i) { //有比堆顶更小的元素 if (q.peek() > input[i]) { q.poll();//堆顶出队 q.offer(input[i]);//新的较小元素进队,进队时会自动根据内部的比较算法进行排序 } } for (int i = 0; i < k; ++i) { res.add(q.poll());//将堆的每个值添加到数列中 } return res; } }