《贰》算法竞赛常用的JAVA API--5.HashSet和TreeSet+6.PriorityQueue优先队列

425 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

HashSet和TreeSet

set容器的特点是不包含重复元素,意思就是自动去重。

HashSet

HashSet基于哈希表实现,无序

add(E e)如果容器中不包含此元素,则添加

clear()清空

contains(Object o)查询指定元素是否存在,存在则返回ture

isEmpty()判空

iterator()返回此容器的迭代器

remove(Object o)如果指定元素在此set中则删除

size()返回元素数量

TreeSet

基于红黑树实现,有序

add(E e)如果不存在,则添加

clear()清空

contains(Object o)查询指定元素是否存在,存在返回ture

isEmpty()判空

iterator()返回此容器的迭代器

remvoe(Object o)如果指定元素在此set中移除

size()返回元素数量

以上方法都和HashSet一样,由于是基于红黑树实现的,所以TreeSet和TreeMap可以二分查找一个比当前元素大的最小元素或者比当前元素小的最大元素。

ceiling(E e)返回一个大于等于当前元素的最小元素,不存在返回null

floor(E e)返回一个小于等于当前元素的最大元素,不存在返回null

higher(E e)返回此set中严格大于给定元素的最小元素,不存在返回null

lower(E e)返回此set中严格小于给定元素的最大元素,不存在返回null

first()返回第一个元素

last()返回最后一个元素

Set只能通过增强型for和迭代器来遍历它

6.PriorityQueue优先队列

PriorityQueue

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

初始化

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

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

常用函数

add(E e) 将指定的元素插入此优先队列 O(logn)

clear() 清空 O(1)

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

interator() 返回在此队列中的元素上进行迭代的迭代器 O(1)

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

peek()获取第一个元素,即最小或最大元素 O(1)

poll()获取并移除第一个 O(logn)

remove(Object o) 移除指定元素(第一个) O(n)

size() 返回元素个数 O(1)

实现大根堆的两种方式

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

1.使用自定义比较器

 public static class NodeComparator implements Comparator<Integer>{
     @override
     public int compare(Integer o1, Integer o2){
         return o2 - o1;
     }
 }

2.Collections的reverseOrder方法实现了自然排序的相反排序,返回一个比较器,以此来构造大顶堆,维护队列中最大的元素

 PriorityQueue<Integer> hip = new PriorityQueue<>(Collections.reverseOrder());