📜  哪些Java库可用于竞争性编程?

📅  最后修改于: 2021-06-25 20:35:46             🧑  作者: Mango

Java是竞争性编程中最推荐的语言之一(请参阅上一篇文章以获取更多详细信息)

Java Collection框架包含许多可用于不同目的的容器。在本文中,我们将从竞争性编程和面试准备的角度重点介绍最重要的容器。

ArrayList :动态大小可变的数组,允许在不关心数组大小的情况下进行插入和删除。它还具有纯数组的优点,例如随机访问和缓存友好性。 Java ArrayList支持许多其他操作,如indexOf(),remove()等。普通数组不支持这些函数。

队列:由LinkedList实现的接口。在我们希望具有FIFO项目顺序的情况下很有用。问题示例包括:生成具有给定数字的数字,流中的第一个非重复字符,树及其变化的层级遍历,图形及其变化的BFS。请参阅队列练习问题以获取更多练习。

堆栈:用于我们希望获得LIFO订单的情况。示例问题包括平衡括号,股票跨度问题,直方图中的下一个更大的元素和最大的面积。请参阅堆栈练习问题以获取更多练习。

Deque :Deque是由LinkedList类实现的接口。出队支持O(1)时间两端的插入和删除。我们可以使用Deque接口同时实现Queue和Stack。事实上,它是推荐使用的Deque在Java中实现栈因为在Java Stack类是一个老样式类。关于Deque的示例问题是,访问所有的汽油泵和所有大小为k的子阵列的最大值。

Java的Set(下面讨论的TreeSet,HashSet和LinkedHashSet)用于存储键的集合,而Java的Map(下面讨论的TreeMap,HashMap和LinkedHashMap)用于存储键值对的集合。

TreeSetTreeMap :这两个都实现自平衡二进制搜索树(特别是Red Black Tree)。在我们希望维护具有中等(比数组更好,比不及哈希更好)搜索,插入和删除查询时间的排序项目的情况下很有用。示例问题包括:左侧的最近最大或相同的值,为数组中每个元素查找最接近的值,等等。当我们希望仅存储键时,我们使用TreeSet,而当我们希望存储键值对时,则使用TreeMap。

HashSet和HashMap :这两个都通过链接实现散列。当我们希望快速搜索,插入和删除(所有三个操作均为O(1))时很有用。这是该行业中最常用的数据结构之一,也是学术界最低估的数据结构。存在许多流行的问题,计数不同的元素,数组项的频率,具有0和的子数组以及两个未排序数组的并集和交集。请参阅散列练习问题以获取更多练习。

LinkedHashSetLinkedHashMap :通过链接实现散列,但还可以保持插入顺序。 HashSet和HashMap不维护任何顺序。因此,如果我们希望按与输入中出现的顺序相同的顺序打印不同的元素,则需要使用LinkedHashSet;如果我们希望按与它们出现的顺序相同的顺序打印项目及其频率,则需要使用LinkedHashMap。

PriorityQueue :默认情况下实现最小堆。我们也可以通过传递Collections.reverseOrder()作为参数来创建最大堆。每当我们希望有效地找到最小或最大元素时,就会使用PriorityQueue。它用于实现流行的算法,例如Prim算法,Dijkstra最短路径,霍夫曼编码,K个最大元素,可购买和合并K个排序数组的最大玩具,流的中位数。请参阅堆练习问题以获取更多练习。

在本文的下一部分中,我们将介绍更重要的Java库。