题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
Java题解
毫无疑问的想到TopK的堆排序,但是堆这东西写起来太麻烦,直接上treeSet
换句话说就是让系统帮我们维护这个堆或者说是树
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
if(k > input.length || k == 0){
return new ArrayList<Integer>();
}
TreeSet<Integer> set = new TreeSet<Integer>();
for (int i : input) {
if(set.size() < k){
set.add(i);
}else{
if(i < set.last()){
set.remove(set.last());
set.add(i);
}
}
}
ArrayList<Integer> arrayList = new ArrayList<Integer>(k);
arrayList.addAll(set);
return arrayList;
}
}
如果执意使用堆排序的话应该也能做,在网上找了一位大神的优化版堆排序:
import java.util.*;
public class Solution {
public ArrayList<Integer>GetLeastNumbers_Solution(int[] input, int k) {
ArrayList<Integer> array = new ArrayList<Integer>();
if(input==null||input.length==0||k<=0||k>input.length){
return array;
}
for(int i=k/2-1;i>=0;i--){
buildMaxHeapSort(input,i,k);
}
for(int j=k;j<input.length;j++){
if(input[j]<input[0]){
swap(input,0,j);
buildMaxHeapSort(input,0,k);
}
}
for(int i=k-1;i>=0;i--){
array.add(input[i]);
}
return array;
}
public void buildMaxHeapSort(int[] input,int i,int k){
int leftchild=2*i;
int rightchild=2*i+1;
int larget=i;
if(leftchild<k&&input[i]<input[leftchild]){
larget=leftchild;
}
if(rightchild<k&&input[larget]<input[rightchild]){
larget=rightchild;
}
if(larget!=i){
swap(input,i,larget);
buildMaxHeapSort(input,larget,k);
}
}
public void swap(int[] input,int a,int b){
int temp=input[a];
input[a]=input[b];
input[b]=temp;
}
}
/*
来自:https://blog.csdn.net/lingongheng/article/details/52735367?locationNum=6&fps=1
*/