算法速通
二分法
完整笔记参见 二分法
寻找左边界/右边界;有一个明确的 target 与 nums[mid] 对比;l ≤ r
- 根据左右特征进行减治;nums[mid] 与nums[mid+1] or nums[r] 对比; l < r
- 猜答案;在答案集上二分,一般是找左边界 or 右边界; l≤ r
滑动窗口
滑动窗口完整笔记参见 滑动窗口
395. 至少有 K 个重复字符的最长子串(不简单不简单)
1838. 最高频元素的频数 (想不到啊啊啊)
2271. 毯子覆盖的最多白色砖块数 (区间上的滑动窗口)
1423. 可获得的最大点数 (边界窗口转化为正常滑动窗口)
2134. 最少交换次数来组合所有的 1 II (简单的思维转化)
30. 串联所有单词的子串 (模板题,窗口步长的角度)
727. 最小窗口子序列 (字符串匹配,有序匹配)
76. 最小覆盖子串 (字符串匹配,无序匹配)
795. 区间子数组个数 (右区间-左区间)
双指针
双指针完整笔记参见 双指针
双指针有:同向,相向,背向 三种。通常,二分法、单调栈、单调队列、滑动窗口、链表操作等都属于广义的双指针。其本质是维护一段区间。但此处的双指针更多特指以下三种情况
- 维护一段区间的问题 26,283
- 根据单调性不断缩减搜索空间的 11,825
- 抽象为找链表环的问题 287,202
11. 盛最多水的容器 面积取决于指针的距离与值小的值乘积
前缀和 & 差分
前缀和 & 差分速通 完整笔记参见 前缀 & 差分
前缀和 以及 差分算是 写题的简单技巧,尤其是在维护区间和的题目上,该技巧常与二分法、滑动窗口等题型相结合。此外,前缀和的技巧不仅可以应用于数组上,还经常应用与二叉树、链表中。
链表
链表 在这一块重要的是:两种翻转方法,找环入口,两种去重节点题,合并,各种结构转换,结构设计(LRU LFU)
1171. 从链表中删去总和值为零的连续节点 链表的前缀和
二叉树
二叉树完整笔记参见 二叉树 。掌握了递归之后,就可以应对95%的题目了(废话)
图
图完整笔记参见 图
考察点主要有四部分:拓扑排序,BFS,DFS,并查集 (后三部分有各自专题)
可以用拓扑排序判断有没有环
BFS一般用迭代,DFS一般写递归
一般用Dijkstra 做follow up,记住每次选择最短的路径,可以同优先队列来实现
排序算法
排序算法完整笔记参见 排序算法
常考的包括:快速排序,归并排序,堆排序,桶排序(计数排序)等。
栈
单调栈
单调栈 通常用于寻找比当前元素大 or 小的元素,都在站在当前字符的位置看的。
BFS & DFS
均为搜索算法。
BFS 通常只有迭代一种模板,只不过有双向BFS和单向BFS;
DFS & 回溯 包括迭代和递归两种版本。另外,BFS通常需要在入队列的时候标记而不能是出队列的时候标记,只有在入队列的时候标记才能防止重复节点入队。该类型题目注意时间复杂度分析
注:回溯是一种更加通用的算法,DFS是一种与一种树相关的特定的回溯形式,DFS是在逻辑树是回溯。
动态规划
动态规划 无法速通!!! 不过面试常考 时间序列型、双序列型与背包问题,当然,博弈问题也最好有所了解。
单调队列速通
单调队列 常用来维护数据流中的最大值or最小值。最大值或者最小值还是放在队列首部的。
862. 和至少为 K 的最短子数组 209的升级版,想清楚为什么是递增队列?只有维持的是递增队列,才能在左出队的时候,可能更新结果
扫描线速通
前缀树速通
前缀树(Trie树)一种特殊的数据结构。要捋清楚 每个节点的结构。每个节点上有一个 额外的标签,用来标记该节点以上的路径的信息!前缀树上的DFS,insert的操作相当于在建立一棵树,至于怎么在树上遍历完全根据题目来决定。
676. 实现一个魔法字典 前缀树上的DFS
优先队列 & 多路归并
堆 & 优先队列 & 多路归并通常以堆为数据结构。谨记:前 k 大,用小根堆,求前 k 小,用大根堆。
优先队列:
692. 前K个高频单词 自定义堆中存放的节点,且自定义大小比较函数
@871
@846 一手顺子
多路归并:
373. 查找和最小的 K 对数字 剑指offerⅡ P170
并查集
并查集 用于处理集合的合并和查询。其时间复杂度,在加上rank和路径压缩优化后为 log* n, 叫做 Iterated logarithm ,近似O(1) 的 。O(log* n) 是比O(log n) 还要快,近似等于O(1),比O(1)慢一点。
952. 按公因数计算最大组件大小 涉及到 质数分解
树形数组
位运算
位运算经典套路:异或之后取 lowbit, 然后分两组,得到两个值即为答案