一、题目
找出n个数里最小的k个
输入描述:
每个测试输入包含空格分割的n+1个整数,最后一个整数为k值,n不超过100
输出描述:
输出n个整数里最小的k个数。升序输出
例如:
输入:3 9 6 8 -10 7 -11 19 30 12 23 5
输出:-11 -10 3 6 7
题目链接
二、思路
方法一:快排
排序+分区:
找到下标为k的位置,则可知,前k小的都在左边,排序输出即可。
方法二:优先级队列
三、代码
方法一:
import java.util.Arrays;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
// 输入一行数
String str = scanner.nextLine();
// 分割
String[] s = str.split(" ");
int[] num = new int[s.length - 1];
for (int i = 0; i < s.length - 1; i++) {
num[i] = Integer.parseInt(s[i]);
}
// 输入的最后一个为 k 值
int k = Integer.parseInt(s[s.length - 1]);
int start = 0;
int end = num.length - 1;
int index = qSort(num, start, end);
while (index != k) {
if (index > k) {
end = index - 1;
index = qSort(num, start, end);
} else {
start = index + 1;
index = qSort(num, start, end);
}
}
Arrays.sort(num,0,k);
for (int i = 0; i < k; i++) {
System.out.print(i == k-1 ? num[i]:num[i] + " ");
}
}
}
private static int qSort(int[] num, int start, int end) {
int dig = num[start];
while (start < end){
while (start < end && num[end] >= dig){
end--;
}
num[start] = num[end];
while (start < end && num[start] < dig){
start++;
}
num[end] = num[start];
}
num[start] = dig;
return start;
}
}
方法二:
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
String s = scanner.nextLine();
String[] strings = s.split(" ");
int[] arr = new int[strings.length - 1];
for (int i = 0; i < strings.length - 1; i++) {
arr[i] = Integer.parseInt(strings[i]);
}
int k = Integer.parseInt(strings[strings.length - 1]);
int[] result = new int[k];
result = topK(arr,k);
// 依次打印
for (int i = 0; i < k; i++) {
System.out.print(result[i] + " ");
}
}
}
private static int[] topK(int[] arr, int k) {
// 保存返回的结果集合
int[] result = new int[k];
// 默认为升序,不需要自定义比较器
Queue<Integer> queue = new PriorityQueue<Integer>();
for (int i = 0; i < arr.length; i++) {
queue.offer(arr[i]);
}
for (int i = 0; i <k ; i++) {
result[i] = queue.poll();
}
return result;
}
}