/**
* 输入n个整数,找出其中最小的K个数。
* 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
*/
package javabasic.nowcoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.PriorityQueue;
/*
* 思路一:
* 用最大堆保存这k个数,每次只和堆顶比,如果比堆顶小,删除堆顶,新数入堆。
*/
public class Main34 {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> arr = new ArrayList<Integer>();
if(k<=0||k>input.length) {
return arr;
}
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(k,new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
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]) {
Integer poll = maxHeap.poll();
poll=null;
maxHeap.offer(input[i]);
}
}
for(Integer num : maxHeap) {
arr.add(num);
}
return arr;
}
public ArrayList<Integer> GetLeastNumbers_SolutionII(int [] input, int k) {
ArrayList<Integer> arr = new ArrayList<Integer>();
if(input==null||k<=0||k>input.length) {
return arr;
}
Arrays.sort(input);
for(int i=0;i<k;i++) {
arr.add(input[i]);
}
return arr;
}
public static void main(String[] args) {
int[] res = {4,5,1,6,2,7,3,8};
ArrayList<Integer> getLeastNumbers_Solution = new Main34().GetLeastNumbers_Solution(res,4);
System.out.println(getLeastNumbers_Solution);
}
}