首页 > 其他分享 >PriorityQueue(优先队列)

PriorityQueue(优先队列)

时间:2024-06-22 22:59:20浏览次数:14  
标签:优先 offer 队列 元素 PriorityQueue v1 queueA new

hot100的常用JAVA API:PriorityQueue(优先队列)

文章目录


一、PriorityQueue是什么?

翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆顶为最小值。

二、常用函数

1.初始化

代码如下(示例):使用默认的初始容量(11)创建一个 PriorityQueue,并根据其自然顺序对元素进行排序。

PriorityQueue<Integer> Q = new PriorityQueue<>();

2.修改变成大顶堆(默认是小顶堆)

这里的知识点包括:

  • PriorityQueue 默认是小根堆,大根堆需要重写比较器。
  • 可以在 new PriorityQueue<>() 中的参数部分加入比较器。
  • 具体写法是:(v1, v2) -> v2 - v1。
  • Queue 类的输入是 offer() 方法,弹出是 poll() 方法。
//1.lambda表达式写法
Queue<Integer> queueA = new PriorityQueue<>((v1, v2) -> v2 - v1);
//2.匿名内部类写法
Queue<Integer> queueA = new PriorityQueue<>(new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				// TODO 自动生成的方法存根
				return o2-o1;
			}
});

2.队列中插入元素

Q.add(a);
Q.offer(E e);

3.获取元素(最小值或者最大值)

Q.peek();//获取最小值(默认)或者获取最大值
Q.poll();//获取并且删除最小值(默认)或者获取最大值

4.判断是否包含某个元素、移除指定元素、获取元素个数

Q.contains(Object o) // 如果包含指定元素返回true
Q.remove(Object o) // 移除指定元素
Q.size() // 返回元素个数

5.程序实例

5.1实现小顶堆并获取最小的元素

//     输入:   3 5 7 2 1 -1 10 -2 -3 52
public class Queue01 {
    public static void main(String[] args) {
//        Queue<Integer> queueA = new PriorityQueue<>((v1, v2) -> v2 - v1);
//        queueA.offer(1);
//        queueA.offer(2);
//        queueA.offer(3);
//        System.out.println(queueA.poll());
//        queueA.size();

        Scanner in = new Scanner(new InputStreamReader(System.in));
        PriorityQueue<Integer> Q = new PriorityQueue<>();
        int a;
        for(int i = 0; i < 10; i++){
            a = in.nextInt();
            Q.add(a);
        }
//        Q.poll();
        System.out.print(Q.peek()+" ");// 输出当前队列的最小元素 -3

    }
}

5.2实现大顶堆并获取最大的元素

//输入: 3 5 7 2 1 -1 10 -2 -3 52 
public class Queue01 {
    public static void main(String[] args) {
//        Queue<Integer> queueA = new PriorityQueue<>((v1, v2) -> v2 - v1);
//        queueA.offer(1);
//        queueA.offer(2);
//        queueA.offer(3);
//        System.out.println(queueA.poll());
//        queueA.size();

        Scanner in = new Scanner(new InputStreamReader(System.in));
        PriorityQueue<Integer> Q = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
        int a;
//        3 5 7 2 1 -1 10 -2 -3 52
        for(int i = 0; i < 10; i++){
            a = in.nextInt();
            Q.add(a);
        }
        Q.poll();
        System.out.print(Q.peek()+" ");// 输出当前队列的最大元素 10

    }
}

总结

以上就是对优先队列的常用的一些API的简单介绍,方便大家在刷力扣的时候使用。具体底层数据结构可以参考这篇文章:
Java堆结构PriorityQueue完全解析
可以拿力扣中的题目进行验证自己是否掌握优先队列:
1.前 K 个高频元素
2.合并K个升序链表

标签:优先,offer,队列,元素,PriorityQueue,v1,queueA,new
From: https://blog.csdn.net/pearhair/article/details/139889050

相关文章

  • 面试官:请你实现三栏布局并且优先加载中间内容 我:稳啦- ̗̀(๑ᵔ⌔ᵔ๑)
    前言三栏布局是网页设计中一种经典布局方式,它将页面分为三个垂直部分:左栏、中栏和右栏,三栏在同一行显示。这种布局模式在很多网站的首页或内容密集型页面中非常常见,因为它能够有效地组织信息,提供良好的用户体验。常常也是作为面试常考题出现,今天将为大家介绍常见的三栏布......
  • 读者写者问题(读者优先、公平竞争、写者优先)
    1.读者优先        当有读者进程进行读时,允许多个读者同时读,但不允许写者写;当有写者进程进行写时,不允许其他写者写,也不允许读者读读者算法:p(r_mutex);//申请修改read_countifread_count==0:p(mutex);//获得读文件的权限read_count++;V(r_mutex);阅......
  • 队列:先进先出的数据结构
    1.队列的概念及结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstInFirstOut)入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头2.队列的实现队列可以通过多种方式实现,包括数组、链表等。数......
  • 【广度优先搜索 深度优先搜索 图论】854. 相似度为 K 的字符串
    本文涉及知识点广度优先搜索深度优先搜索图论图论知识汇总深度优先搜索汇总C++BFS算法LeetCode854.相似度为K的字符串对于某些非负整数k,如果交换s1中两个字母的位置恰好k次,能够使结果字符串等于s2,则认为字符串s1和s2的相似度为k。给你两个字母......
  • Python 全栈系列256 异步任务与队列消息控制(填坑)
    说明每个创新都会伴随着一系列的改变。在使用celery进行异步任务后,产生的一个问题恰好也是因为异步产生的。内容1问题描述我有一个队列stream1,对应的worker1需要周期性的获取数据,对输入的数据进行模式识别后分流。worker1我设施为10秒运行一次。然后我就发现输出......
  • C/C++ stack实现深度优先搜索DFS算法详解及源码
    深度优先搜索(DepthFirstSearch,DFS)是一种图遍历算法,它从一个节点开始,通过访问其相邻节点的方式,依次深入到图中的更深层次。Stack(栈)是一种先进后出(LastInFirstOut,LIFO)的数据结构,它非常适合实现DFS算法。首先,我们来解释一下Stack实现DFS算法的原理。DFS算法的核心思想是......
  • 消息队列(MQ)学习文档
    目录1.简介2.MQ的优势2.1解耦2.2异步2.3消峰3.MQ的劣势3.1系统可用性降低3.2系统复杂度提高4.常见的MQ产品4.1ApacheKafka4.2RabbitMQ4.3ActiveMQ4.4RocketMQ5.MQ的工作模式5.1点对点模式(P2P)5.2发布/订阅模式(Pub/Sub)5.3请求/回复模式(Reques......
  • 优先级队列(堆)的知识点详解
    目录1.优先级队列1.1概念2.优先级队列的模拟实现2.1堆的概念2.2堆的存储方式2.3堆的创建2.3.1堆向下调整2.4堆的插入与删除2.4.1堆的插入2.4.2堆的删除3.常用接口介绍3.1PriorityQueue的特性3.2PriorityQueue常用接口介绍1.优先级队列1.1概念前......
  • 数据结构——队列(Queue)详解
    1.队列(Queue)1.1概念队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstInFirstOut)的性质入队列:进行插入操作的一端称为队尾(Tail/Rear)出队列:进行删除操作的一端称为队头(Head/Front)2队列的使用在Java中,Queue是个接......
  • 消息队列kafka中间件详解:案例解析(第10天)
    系列文章目录1-消息队列(熟悉)2-Kafka的基本介绍(掌握架构,其他了解)3-Kafka的相关使用(掌握kafka常用shell命令)4-Kafka的PythonAPI的操作(熟悉)文章目录系列文章目录前言一、消息队列(熟悉)1、产生背景2、消息队列介绍2.1常见的消息队列产品2.2应用场景2.3消息队列中两......