一、题目描述
题目描述 输入n个整数,找出其中最小的K个数。 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
二、解题思路
这是典型的面试高频考点,Top-K问题,需要读者重视这块内容。
这是我之前写的东西,链接为:https://blog.csdn.net/alan_gaohaodong/article/details/83786814
方法一、可以用选择排序,选择k遍,即可得出结果,时间复杂度为O(nk)。
方法二、可以用大顶堆来做,时间复杂度为:O(nlogk)。
三、java代码
import java.util.ArrayList;
import java.util.TreeSet;
/**
* @Desc: 最小的K个数
*/
public class Solution_30 {
/**
* 题目描述 输入n个整数,找出其中最小的K个数。 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
*/
public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
if (input == null) {
return null;
}
ArrayList<Integer> list = new ArrayList<Integer>(k);
if(k>input.length){
return list;
}
TreeSet<Integer> tree = new TreeSet<Integer>();
for(int i=0;i<input.length;i++){
tree.add(input[i]);
}
int i=0;
for(Integer elem : tree){
if(i>=k){
break;
}
list.add(elem);
i++;
}
return list;
}
}
PS:TreeSet内部原理是TreeMap,底层是红黑树。
如想了解更多,可以参考:https://blog.csdn.net/chenssy/article/details/26668941