优先队列、图、前缀树、线段树、树状数组

本文整理于【拉勾*力扣】课程笔记,侵删~

 

1、优先队列

优先队列、图、前缀树、线段树、树状数组

优先队列、图、前缀树、线段树、树状数组

优先队列、图、前缀树、线段树、树状数组

向上筛选:每次新元素放在最底部,然后和它的父节点比较,若新元素优先级高,则交换新元素与父节点的位置,直到无法交换

向下筛选:每次新元素放在最顶部,然后和它的两个子节点比较,如果哪个子节点的优先级高,则交换新元素与这个子节点的位置,直到无法交换。

优先队列、图、前缀树、线段树、树状数组

 

2、题目:前K个高频元素(优先队列经典题型)

先使用哈希表记录每个元素的出现次数,然后用哈希表构造一个优先队列,问题迎刃而解

优先队列、图、前缀树、线段树、树状数组

 

3、图

优先队列、图、前缀树、线段树、树状数组

优先队列、图、前缀树、线段树、树状数组

优先队列、图、前缀树、线段树、树状数组

 

4、题目:判断二分图(图的遍历)

优先队列、图、前缀树、线段树、树状数组

 

5、前缀树

优先队列、图、前缀树、线段树、树状数组

优先队列、图、前缀树、线段树、树状数组

优先队列、图、前缀树、线段树、树状数组

优先队列、图、前缀树、线段树、树状数组

优先队列、图、前缀树、线段树、树状数组

 

6、题目:单词搜索(深度优先、前缀树)

优先队列、图、前缀树、线段树、树状数组

解法:

深度优先算法搜索二维网格,得到所有可能的单词列表;

将字典构造成一个前缀树;

遍历单词列表,与前缀树对比,如果可以匹配,继续向下搜索,否则结束

优先队列、图、前缀树、线段树、树状数组

 

7、线段树

优先队列、图、前缀树、线段树、树状数组

优先队列、图、前缀树、线段树、树状数组

 

8、题目:计算右侧小于当前元素的个数

优先队列、图、前缀树、线段树、树状数组

解法:

线段树中每个节点保存的是数组中某一段的总和,对本题目而言,我们可以让每个节点保存一段有序数组的总和。

根节点保存的是数组中最小值到最大值的所有元素的总和,分割根节点为左右两个节点,直接分割结束;

初始时,每个节点的元素个数都为0。从数组的最后一个元素开始遍历;

当遍历元素1时,对应区间的节点元素个数加1,线段树如下图:

优先队列、图、前缀树、线段树、树状数组

当遍历元素6时,对应区间的节点元素个数加1,线段树如下图:

优先队列、图、前缀树、线段树、树状数组

欲求元素【6】右边的数字有几个小于当前元素,也就是1-5区间的数字有几个,我们从根节点出发,左子树【1-3】在【1-5】区间内,直接返回个数1,右子树【4-6】和【4-5】有交集,继续向下遍历【4-5】,无需再分,返回个数0,最终【6】右边的数字有1+0=1个元素小于当前元素,以此类推...

算法复杂度:O(nlogn)

 

9、树状数组

优先队列、图、前缀树、线段树、树状数组

和优先队列类似,优先队列用数组表示完全二叉树,而树状数组是多叉树

和线段树类似

优先队列、图、前缀树、线段树、树状数组