PriorityQueue—优先级队列FollowUp

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;
    }
}

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值