题目描述:
输入n个整数,输出其中最小的k个。
详细描述:
接口说明
原型:
bool GetMinK(unsignedint uiInputNum, int * pInputArray, unsignedint uiK, int * pOutputArray);
输入参数:
unsignedint uiInputNum //输入整数个数
int * pInputArray //输入整数数组
unsignedint uiK //需输出uiK个整数
输出参数(指针指向的内存区域保证有效):
int * pOutputArray //最小的uiK个整数
返回值:
false 异常失败
true 输出成功
Java实现:
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int total = sc.nextInt();
int k = sc.nextInt();
int[] arr = new int[total];
int[] minK = new int[k];
for (int i = 0; i < total; i++) {
arr[i] = sc.nextInt();
}
getMinK(total, arr, k, minK);
for (int i = 0; i < k-1; i++) {
System.out.print(minK[i]+ " ");
}
System.out.println(minK[k-1]);
}
}
private static void getMinK(int total, int[] arr, int k, int[] minK) {
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(k, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
for (int i = 0; i < total; i++) {
if (maxHeap.size() != k) {
maxHeap.offer(arr[i]);
}else if (maxHeap.peek() > arr[i]) {
Integer tmp = maxHeap.poll();
tmp = null;
maxHeap.offer(arr[i]);
}
}
for (int i = k-1; i >= 0 ; i--) {
minK[i] = maxHeap.poll();
}
}
}
关键点:
- 《剑指Offer》原题
- 在不修改原数组的情况下,使用【最大堆】这种数据结构维护数组中最小的k个数
- 之所以是最大堆是因为需要随时得到最小的k个数中最大的那个,以便新来的数比较
- 时间复杂度为O(nlogn),空间复杂度为O(k)