从一列n个数字中取最小的前k个数字。这是一个面试经常会问到问题,回答这个问题并不难,但是如何能分析出最优的算法,能够分析出多少种算法,这会是面试官真正感兴趣的问题。这里总结一下这个问题的所有解法与复杂度。
1. 快速排序法 O(N*logN)
最简单直接的方法就是快速排序+返回前k个数字。快速排序是复杂度为N*logN的算法,而查找前k个数字需要是时间复杂度为O(K)。总体的时间复杂度为O(N*logN)。
public class Main {
public static void main(String[] args) {
int[] arr = {
1, 4, 3, 5, 7, 6, 2, 8, 9};
//模拟需要排序的数组
int k = 4;
//模拟需要返回的前k个最大数字
int res[] = qSAndBS(arr, k);
}
private static int[] qSAndBS(int[] arr, int k) {
quickSort(arr, 0, arr.length - 1);
int[] res = new int[k];
for (int i = 0; i < k; i++)
res[i] = arr[i];
return res;
}
private static void quickSort(int[] arr, int start, int end) {
if (start >= end) return;