题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,
//1,先排序;2,冒泡排序3,堆排序???;4,利用Treeset排序
/*
*基于堆排序算法,构建最大堆。时间复杂度为O(nlogk)
*如果用快速排序,时间复杂度为O(nlogn);
*如果用冒泡排序,时间复杂度为O(n*k)
*/
public class 最小k的个数 {
public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
ArrayList<Integer> result = new ArrayList<Integer>();
int length=input.length;
if(length==0||k>length||input==null||k<=0) return result;
//创建大顶堆
PriorityQueue<Integer > maxHeap=new PriorityQueue<>(k,new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o2.compareTo(o1);
}
});
for (int i = 0; i < input.length; i++) {
if (maxHeap.size()!=k) {
maxHeap.offer(input[i]);
} else if(maxHeap.peek()>input[i]) {
maxHeap.poll();
maxHeap.offer(input[i]);
}
}
Iterator<Integer> it = maxHeap.iterator();
while (it.hasNext()) {
result.add(it.next());
}
return result;
}
}
public class 最小的k个数 {
public ArrayList<Integer> GetLeastNumbers_Solution1(int [] input, int k) {
ArrayList<Integer>list=new ArrayList<>();
if(input.length==0 ||input.length<k) return list;
Arrays.sort(input);
for (int i = 0; i < k; i++) {
list.add(input[i]);
}
return list;
}
public ArrayList<Integer> GetLeastNumbers_Solution2(int [] input, int k) {
ArrayList<Integer> al = new ArrayList<Integer>();
if (k > input.length) {
return al;
}
for (int i = 0; i < k; i++) {
for (int j = 0; j < input.length - i - 1; j++) {
if (input[j] < input[j + 1]) {
int temp = input[j];
input[j] = input[j + 1];
input[j + 1] = temp;
}
}
al.add(input[input.length - i - 1]);
}
return al;
}
public ArrayList<Integer> GetLeastNumbers_Solution3(int [] input, int k) {
if (input == null || input.length == 0 || k > input.length) {
return new ArrayList<>();
}
TreeSet<Integer> set = new TreeSet<>();
for (int anInput : input) {
set.add(anInput);
}
return new ArrayList<>(set.subSet(0, k + 1));
}
}