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;
}
}


京公网安备 11010502036488号