java算法竞赛_Java算法竞赛常用类:PriorityQueue(优先队列)

Java算法竞赛常用类:PriorityQueue(优先队列)

初始化

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

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

常用函数

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

clear()// 清空

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

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

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

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

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

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

size() // 返回元素个数

实现大根堆的两种方式

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

使用自定义比较器

将所有数据变为之前自身的负数之后在插入, 因为添加个负号就相当于是逆序了嘛。1 <2 < 3 取负之后变为 -1> - 2 > - 3

实例

public static void main(String[] args){

Scanner in = new Scanner(new InputStreamReader(System.in));

PriorityQueue 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

这里有一个地方要注意,Java的优先队列是小顶堆,并且堆的性质决定了,只能保证堆顶是最小/大的,所以迭代器遍历没有意义,只能选择不断poll出堆顶元素来获得最小元素:

package com.jiading.noi;

/*

* 2405:Avoid The Lakes

* http://noi.openjudge.cn/ch0308/2405/

*/

import java.util.Iterator;

import java.util.PriorityQueue;

public class Problem19 {

public static void main(String[] args) {

PriorityQueueheap=new PriorityQueue<>();

heap.add(5);

heap.add(10);

heap.add(1);

System.out.println("使用迭代器");

Iterator iterator=heap.iterator();

while(iterator.hasNext()) {

System.out.println(iterator.next());

}

System.out.println("直接访问堆");

while(!heap.isEmpty()) {

System.out.println(heap.poll());

}

}

}

输出是:

使用迭代器

1

10

5

直接访问堆

1

5

10

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值