//堆
//一种小顶堆 另一种大顶堆
//大顶堆最顶上是最大的数 当堆中存入k个数的时候,第k+1个数a来比较其堆顶的数b。若a>=b,则忽略;因为
//堆中k个数都小于等于a;如果a<b,把堆顶poll,把a加入,重新调整堆;
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> list=new ArrayList<>();
//注意参数判断
if(input==null || input.length==0 ||k<=0) return list;
//默认是小顶堆 如果保证大顶堆 要重写比较器
PriorityQueue<Integer> priorityQueue=new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//return o2-o1;
return o2-o1;
}
});
for (int i=0;i<input.length;i++){
if (i<=k-1){
priorityQueue.add(input[i]);
}else {
int top = priorityQueue.peek();
if(top>input[i]){
priorityQueue.poll();
priorityQueue.add(input[i]);
}
}
}
//在不足k个元素的时候 需要返回空list
if(priorityQueue.size()<k) return list;
while (priorityQueue.size()>0){
list.add(priorityQueue.poll());
}
//保证list里的数据从小到大
Collections.reverse(list);
return list;
}第二种:冒泡
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k){
ArrayList<Integer> list=new ArrayList<>();
if (input==null||input.length==0 ||k<=0) return list;
if (input.length<k) return list;
for (int p=1;p<=k;p++){
for (int i=0;i<input.length-p;i++){
if (input[i]<input[i+1]) swap(input,i,i+1);
}
}
for (int i=input.length-1;i>=input.length-k;i--){
System.out.println(input[i]);
list.add(input[i]);
}
return list;
}
private void swap(int[] input, int i, int i1) {
int temp=input[i];
input[i]=input[i1];
input[i1]=temp;
}
京公网安备 11010502036488号