优先队列、图、前缀树、线段树、树状数组
本文整理于【拉勾*力扣】课程笔记,侵删~
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、树状数组
和优先队列类似,优先队列用数组表示完全二叉树,而树状数组是多叉树
和线段树类似