算法竞赛中的常用JAVA API:PriorityQueue(优先队列)

PriorityQueue

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

初始化

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

PriorityQueue<Integer> Q = new PriorityQueue<>(); // 初始化

常用函数

add(E e)//将指定的元素插入此优先级队列。

clear()//清空

contains(Object o) // 如果包含指定元素返回true

iterator()//返回在此队列中的元素上进行迭代的迭代器。

offer(E e) // 将指定元素插入此优先队列

peek() // 获取第一个元素,及最小或最大元素

poll() // 获取并移除第一个

remove(Object o) // 移除指定元素

size() // 返回元素个数

实现大根堆的两种方式

因为java中的优先队列默认是小根堆,要实现大根堆可以用以下两种方法:

  1. 使用自定义比较器

    如何用 PriorityQueue 实现大根堆 queueA?

    这里的知识点包括:

    • PriorityQueue 默认是小根堆,大根堆需要重写比较器。

    • 可以在 new PriorityQueue<>() 中的参数部分加入比较器。

    • 具体写法是:(v1, v2) -> v2 - v1。

    • Queue 类的输入是 offer() 方法,弹出是 poll() 方法。

      Queue<Integer> queueA = new PriorityQueue<>((v1, v2) -> v2 - v1);
      queueA.offer(1);
      queueA.poll();
      queueA.size();
      A=new PriorityQueue<>(new Comparator<Integer>() {
      
      			@Override
      public int compare(Integer o1, Integer o2) {
      // TODO 自动生成的方法存根
      return o2-o1;
      }
      });
      PriorityQueue<Integer> pq=new PriorityQueue<>(Collections.reverseOrder());
  2. 将所有数据变为之前自身的负数之后在插入, 因为添加个负号就相当于是逆序了嘛。1 < 2 < 3 取负之后变为 -1 > - 2 > - 3

实例

public static void main(String[] args){
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);
System.out.print(Q.peek()+" ");// 输出当前队列的最小元素
}
} 输入: 1 -1 -2 -3 10 -4 -5 -6 -7 -8
输出: 1 -1 -2 -3 -3 -4 -5 -6 -7 -8

输入里面的那个是10是什么意思呀?

答:这个是小根堆, 每次输出堆中最小的元素, 输入10之后,最小的元素仍然是-3, 所以还是输出了-3

注: 转载参考

https://blog.csdn.net/qq_40525997/article/details/107846618

https://blog.csdn.net/qq_38522564/article/details/115029671

https://www.pianshen.com/article/84061294120/

https://blog.csdn.net/GD_ONE/article/details/104128985

算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)的更多相关文章

  1. 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)

    算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...

  2. 算法竞赛中的常用JAVA API :HashMap 和 TreeMap(转载)

    算法竞赛中的常用JAVA API :HashMap 和 TreeMap 摘要 本文主要介绍Map接口下的HashMap和TreeMap. HashMap HashMap是基于哈希表的 Map 接口的实 ...

  3. 8.算法竞赛中的常用JAVA API :Calendar日期类

    8.算法竞赛中的常用JAVA API :Calendar日期类 摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法.Date类大部分方法已经 ...

  4. 7.算法竞赛中的常用JAVA API :String 、StringBuilder、StringBuffer常用方法和区别(转载)

    7.算法竞赛中的常用JAVA API :String .StringBuilder.StringBuffer常用方法和区别 摘要 本文将介绍String.StringBuilder类的常用方法. 在j ...

  5. 6.算法竞赛中的常用JAVA API :Math类(转载)

    6.算法竞赛中的常用JAVA API :Math类 求最值 最小值 Math.min(int a, int b) Math.min(float a, float b) Math.min(double ...

  6. 算法竞赛中的常用JAVA API :大数类(转载)

    5.算法竞赛中的常用JAVA API :大数类 摘要 java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1 对应的十进制数是9223372036854775807(long类型的最大 ...

  7. 常用JAVA API :String 、StringBuilder、StringBuffer的常用方法和区别

    摘要 本文将介绍String.StringBuilder类的常用方法. 在java中String类不可变的,创建一个String对象后不能更改它的值.所以如果需要对原字符串进行一些改动操作,就需要用S ...

  8. Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例

    摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...

  9. eclipse 中使用中文JAVA api文档

    http://hi.baidu.com/danghj/item/7625a1be20946e43ba0e1202在eclipse中使用中文JAVA api文档Sun 官方的中文版 Java API 文 ...

随机推荐

  1. 关于Feign的Fallback处理

    Feign的不恰当的fallback Feign的坑不少,特别与Hystrix集成之后. 在微服务引入Feign后,上线不久后便发现,对于一个简单的查询类调用,在下游返回正常的"404-资源 ...

  2. Redis和Memcached到底有什么区别?

    前言 我们都知道,Redis和Memcached都是内存数据库,它们的访问速度非常之快.但我们在开发过程中,这两个内存数据库,我们到底要如何选择呢?它们的优劣都有哪些?为什么现在看Redis要比Mem ...

  3. 计算机基础 | 文档神器docsify安装及基本使用

    为啥要用docsify? 神器Docsify让你的文档变得美观,配合typora,从此爱上看文档,各种优点:小巧.快速.美观.方便.快捷.上手快,可以浏览如下优秀案例 ve-charts pyecha ...

  4. .Net Core微服务——服务发现:Consul(一)

    先思考一些问题:它是做什么的.以及怎么使用它.带着这些问题往下走. consul是做什么的 consul用于微服务下的服务治理.服务治理是什么?它包含但不限于:服务发现.服务配置.健康检查.键值存储. ...

  5. Django基础-02篇 Models的属性与字段

    1.models字段类型 AutoField():一个IntegerField,根据可用ID自动递增.如果没指定主键,就创建它自动设置为主键. IntegerField():一个整数: FloatFi ...

  6. PYTHON 解决ModuleNotFoundError: No module named 'win32com'

    d:\python37\scripts\>pip install pypiwin32

  7. SpringBoot配置Https

    HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认 ...

  8. Ubuntu18.04 安装opensips,实现局域网内sip语音视频通话

    Ubuntu18.04直接安装opensips 本人实践亲测有效,用docker安装opensips尝试多次均无法连接mysql数据库,故舍弃,直接在主机上安装opensips 部分内容参考自:htt ...

  9. 【LeetCode】1248. 统计「优美子数组」

    1248. 统计「优美子数组」 知识点:数组:前缀和: 题目描述 给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」. ...

  10. xshell工具使用

    一.下载安装 参考见:https://www.bilibili.com/video/BV1hh411k7vy?from=search&seid=2244124597826079746 流程: ...