问题一:求出数组中最小的k个数
参考博文:https://blog.csdn.net/pcwl1206/article/details/86425013
思路一:维护一个k的大根堆即可
public static List<Integer> process(int arr[], int k) {
ArrayList<Integer> list = new ArrayList<Integer>();
int len = arr.length;
if (k > len || k == 0) {
return list;
}
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(k, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
// 维持k个数的大根堆
for (int i = 0; i < arr.length; i++) {
// 如果大根堆的大小小于k,直接将数插入
if (maxHeap.size() != k) {
maxHeap.add(arr[i]);
} else if (maxHeap.peek() > arr[i]) {// 大根堆里面已经有k个数了,那就需要将其中的数进行替换
Integer poll = maxHeap.poll();
poll = null;
maxHeap.add(arr[i]);
}
}
for (Integer x : maxHeap) {
list.add(x);
}
return list;
}
可用于数据量较大的时候
思路二:利用快排的思想
public class TopKInArra {
//partition
public static int partition(int arr[],int left,int right) {
if(right<left) {
return 0;
}
int i=left;
int j=right+1;
int help=arr[left];
while(true) {
while(i<right&& arr[++i]<=help) {
}
while(j>0&&arr[--j]>help) {
}
if(i>=j) {
break;
}
swap(arr,i,j);
}
swap(arr,left,j);
return j;
}
//final
public static List<Integer> process(int arr[],int k){
List<Integer> list=new ArrayList<Integer>();
if(arr==null||arr.length==0) {
return list;
}
int start=0,end=arr.length-1;
int index=partition(arr,start,end);
while(index!=k-1) {
if(k-1>index) {
start=index+1;
index=partition(arr,start,end);
}else if(k-1<index) {
end=index-1;
index=partition(arr,start,end);
}
}
for(int i=0;i<k;i++) {
list.add(arr[i]);
}
return list;
}
private static void swap(int[] arr, int i, int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
变种:求数组中最大的k个数
public class TopKInArray3 {
public static List<Integer> process(int arr[], int k) {
ArrayList<Integer> list = new ArrayList<Integer>();
int len = arr.length;
if (k > len || k == 0) {
return list;
}
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
// 维持k个数的小根堆
for(int i=0;i<k;i++) {
minHeap.add(arr[i]);
}
for(int i=k;i<arr.length;i++) {
if(minHeap.peek()<arr[i]) {
Integer poll=minHeap.poll();
poll=null;
minHeap.add(arr[i]);
}
}
for (Integer x : minHeap) {
list.add(x);
}
return list;
}