一.数组排序法
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param input int整型一维数组
* @param k int整型
* @return int整型ArrayList
*/
public ArrayList<Integer> GetLeastNumbers_Solution (int[] input, int k) {
// write code here
//如果是空数组,返回空
if (input == null) {
return null;
}
//用len来记录数组的长度
int len = input.length;
//保证k的合法性
if (k < 0 || k > len) {
return null;
}
//创建一个ArrayList用来存放已经排好序的元素
ArrayList<Integer> ints = new ArrayList<>();
//如果k等于0,返回空的数组
if (k == 0) {
return ints;
}
//对传入的数组进行排序操作
Arrays.sort(input);
//遍历k次,把排好序的元素放入到ArrayList中
for (int i = 0; i < k; i++) {
ints.add(input[i]);
}
return ints;
}
}
二.优先队列(大根堆)
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param input int整型一维数组
* @param k int整型
* @return int整型ArrayList
*/
public ArrayList<Integer> GetLeastNumbers_Solution (int[] input, int k) {
// write code here
//len来记录数组的长度
int len = input.length;
//判断k的合法性
if (k < 0 || k > len) {
return null;
}
//创建一个数组用来保存值
ArrayList<Integer> list = new ArrayList<>();
//如果k等于0或者数组长度为0,返回一个空数组
if (k == 0 || len == 0) {
return list;
}
//o2.compareTo(01)保证这是一个大根堆
Queue<Integer> queue = new PriorityQueue<>(
((o1, o2) -> o2.compareTo(o1))
);
//创建一个k个大小的大根堆,从头遍历k次
for (int i = 0; i < k; i++) {
queue.offer(input[i]);
}
/**
* 从k下标开始,依次跟堆顶元素比较,如果比堆顶元素小,
* 则堆顶元素出队,小的元素入队,然后内部进行排序,
* 又是一个大根堆,始终保持堆顶元素的值是最大的,
* 而堆顶以下的元素都会比堆顶元素小
*/
for (int i = k; i < len; i++) {
if (queue.peek() > input[i]) {
queue.poll();
queue.offer(input[i]);
}
}
//遍历k次,让大根堆依次出队,把值保存到数组中
for (int i = 0; i < k; i++) {
list.add(queue.poll());
}
return list;
}
}