FollowUp大纲:
思维导图:
FollowUp
PriorityQueue:
Q1:但不知道是大根堆化石小根堆
A:Q1
只需要放进去几个元素peek()出元素是大的还是小的
下面如果是5就是小根堆10就是大根堆
A:默认是小根堆
由于offer需要push,里面需要比较,但student并没有指定是比较什么,所以出现异常;
但当只有一个offer的时候就不会有异常
A:因为只有一个元素的时候没有比较
siftUp底层源代码
A:Student自定义类也是可以比较的,需要加一个Comparable接口
不能插入null对象
A:空指针异常
PriorityQueue源码分析
PriorityQueue中的成员变量
offer的源码
grow源码
PriorityQueue要么一点五倍扩容要么二倍扩容
如果不重写equals方法,那么默认比较的是地址
OJ题目
面试题 17.14. 最小K个数
思路1:建立n个结点大的小根堆
public static void main(String[] args) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
int[] array = {10 ,20,19 , 3, 7 ,10};
for (int i = 0; i <array.length ; i++) {
priorityQueue.offer(array[i]);
}
int k = 3;
int[] ret = new int[k];
for (int i = 0; i < k; i++) {
ret[i] = priorityQueue.poll();
}
System.out.println(Arrays.toString(ret));
}
思路2:
复杂度 N*logK建立k个结点的大根堆
class Imp implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
//小根堆
// return o1.compareTo(02);
//大根堆
return o2.compareTo(o1);
}
}
class Solution {
public int[] smallestK(int[] arr, int k) {
int[] ret = new int[k];
if(arr == null || k <= 0){
return ret;
}
Imp imp = new Imp();
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(imp);
//或者
//PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Imp());
for (int i = 0; i <k ; i++) {
priorityQueue.offer(arr[i]);
}
for (int i = k; i < arr.length ; i++) {
int top = priorityQueue.peek();
if(arr[i] < top){
priorityQueue.poll();
priorityQueue.offer(arr[i]);
}
}
for (int i = 0; i < k ; i++) {
ret[i] = priorityQueue.poll();
}
return ret;
}
}
定义一个匿名内部类
class Solution {
public int[] smallestK(int[] arr, int k) {
int[] ret = new int[k];
if(arr == null || k <= 0){
return ret;
}
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
for (int i = 0; i <k ; i++) {
priorityQueue.offer(arr[i]);
}
for (int i = k; i < arr.length ; i++) {
int top = priorityQueue.peek();
if(arr[i] < top){
priorityQueue.poll();
priorityQueue.offer(arr[i]);
}
}
for (int i = 0; i < k ; i++) {
ret[i] = priorityQueue.poll();
}
return ret;
}
}