//堆 //一种小顶堆 另一种大顶堆 //大顶堆最顶上是最大的数 当堆中存入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; }