使用一个最大堆:根结点最大
最大堆先存储数组中前k个元素,将数组中其余的元素逐一与最大堆顶元素比较,如果小于堆顶元素,就将堆顶元素移除,并添加当前元素。
实现:
使用PriorityQueue来实现最大堆,内置比较器(Integer o1,Integer o2){当o1<o2时,返回-1,否则返回1,可以实现队头元素大于队尾元素,PriorityQueue的底层是用最大堆或者最小堆实现的}
import java.util.*; public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> list = new ArrayList<>(); if(input == null || k == 0 || k>input.length){ return list; } Queue <Integer> queue = new PriorityQueue<>(new Comparator<Integer>(){ @Override public int compare(Integer o1, Integer o2) { // TODO Auto-generated method stub if(o1<o2) { return 1; }else { return -1; } } }); for(int i = 0; i<k; i++){ queue.add(input[i]); } for(int i = k; i<input.length; i++){ if(queue.peek()>input[i]){ queue.poll(); queue.offer(input[i]); } } while(!queue.isEmpty()){ list.add(queue.poll()); } return list; } }