-
单链表/双链表(快慢指针)
-
二叉树
-
stack/单调stack/双stack/(在线性时间内找到每个元素的上一个或者下一个更大或更小元素)
-
queue/双端deque/单调deque/priority_queue(单调队列通常用于解决滑动窗口问题,其中我们需要在滑动窗口内找到最大值或最小值)
-
哈希unorderer_map/unordered_set
-
平衡二叉树map/multimap/set/multimap
-
前缀、后缀、左边和右边、一维和二维
- 1423. 可获得的最大点数
- 2132. 用邮票贴满网格图(二维前缀和)
- 1671. 得到山形数组的最少删除次数
- 3212. 统计 X 和 Y 频数相等的子矩阵数量(二维)
- 3152. 特殊数组 II【prefix sum array】
-
差分
-
树状数组
- 307. Range Sum Query - Mutable【单点加法(更新),求区间和】
-
线段树(区间修改/区间add,求区间合、最值,区间内可以聚合的值)
- 手撕线段树,支持区间update和区间聚合值(最大,最小、和)等
- 2276. 统计区间中的整数数目【线段树】
- 699. 掉落的方块【区间更新,查询区间最大值】
- 218. 天际线问题,区间更新,单点查询 【区间更新、查询单点的值】
- 2407.最长递增子序列II【DP、线段树优化、 单点更新、区间最大值
- 2916. 子数组不同元素数目的平方和 II【线段树】
-
trie树
-
字符串匹配
-
并查集
-
高级数据结构实现
-
离线query
-
二分算法 (lower_bound,map.lower_bound,check 二分答案)
-
滑动窗口/双指针
-
排序算法/top k/select kth
-
枚举
-
分组/循环 (group/cycle arrray) - 按照题目要求,数组会被分割成若干组,且每一组的判断/处理逻辑是一样的
-
分组
-
简单但易错题:
-
贪心
-
数论问题
-
模运算
- (a + b) mod c = ((a mod c) + (b mod c)) mod c
- (a * b) mod c = ((a mod c) * (b mod c)) mod c
- (a / b) mod c = (a * (b^(-1))) mod c,其中 b^(-1) 是 b 的乘法逆元。如果 c 是一个素数,且 b 是不可被 c 整除的整数,那么 b 的乘法逆元(b模c的逆元)可以通过以下方式计算:b^(-1) ≡ b^(c-2) (mod c)
- 2842. 统计一个字符串的 k 子序列美丽值最大的数目
- 乘法逆元,扩展欧几里得算法
- 费马定理
-
位运算
- 利用了 num & (num - 1) 的性质,可以快速消除 num 二进制表示中最右边的1
- lowbit(x) = x & (-x),快速获取最右侧1的位置的树,例如lowbit(6) = (110) = 2,lowbit(12) = (1100) = 4
- (x & (1 << i)) == 0
- 异或运算: 0^0=0,0^1=1,1^1=0,
- __builtin_clz, count leading zero
- __builtin_ctz, count trainling zero
- __builtin_popcount, population count
- 260. 只出现一次的数字 I、II、III
- 421. 数组中两个数的最大异或值
- 所有数对按位与结果的异或和
- 318. 最大单词长度乘积
- 2939. 最大异或乘积
- 2397. 被列覆盖的最多行数
- 2897. 对数组执行操作使平方和最大[操作题、位运算、贪心]
-
拒绝抽样(rejection sampling)
-
水塘抽样
-
洗牌算法
-
快速幂
- 50. Pow(x, n)
- 372. 超级次方 (快速幂和模运算)
- 2961.双模幂运算
-
排列组合数学取模(大数取模)
- 求c(n,k),大数c(n,k,mod)
- 31. 下一个排列
- 556. 下一个更大元素 III
- 2842. 统计一个字符串的 k 子序列美丽值最大的数目
- 2930. 重新排列后包含指定子字符串的字符串数目
- 统计感冒序列的数目
- 正着困难反着求(容斥原理)
- 3154. 到达第 K 级台阶的方案数
-
容斥原理
-
区间合并
-
几何运算(距离:距离、欧式距离、曼哈顿距离、切比雪夫距离)
- 曼哈顿距离和切比雪夫距离变换 d(A,B) = max(|x1-y1 - (x2-y2)|,|x1+y1-(x2+y2)|)
- 3102. 最小化曼哈顿距离
-
BFS
- 一维、二维网格、树、图
- BFS/多源BFS(源点为多个)/双向BFS/ BFS + 优先队列
- 2812. 找出最安全路径,多源BFS
- 407. 接雨水 II
- 2258. 逃离火灾
- 2477. 到达首都的最少油耗
-
DFS/剪枝/回溯(深度搜索+限制条件+限制搜索路径)
-
启发式搜索
- 八数码问题
-
线性 DP (包括状态机DP,序列DP,子问题有一个端点是固定不变的)
-
线性DP
-
状态机DP(关键是设计状态以及状态转移方程,之后在处理边界条件)
- 打家劫舍(1.普通、2.环形、3.树形DP、4.DP+二分)
- 将三个数组的排序
- 买卖股票的最大利润(最多一次买卖、最多两次、最多K次、无限次买卖、冷冻期1天、手续费)
-
序列DP (序列DP是动态规划中的一种常见形式,通常用于解决一些关于序列的问题,比如最长递增子序列、编辑距离等)
-
数组DP dp[i][j]
- 3130. 找出所有稳定的二进制数组 II【dp[i][j][2] 以0或者1结尾的方案数】
- 3251. 单调数组对的数目 II【dp[i][j],前i个数,以j结尾的方案数】
-
DP回溯 (很多时候只是求DP最值,但有时需要回溯DP的过程)
-
网格,矩阵DP
-
-
背包 DP
- 01背包
- 494. 目标和
- 完全背包
- 322. 零钱兑换
- 518. 零钱兑换 II
- 多重背包
- 1155. 掷骰子等于目标和的方法数
- 分组背包
-
区间 DP (子问题向内缩小,两端都会向内移动)
-
bitmask,状压 和 状态压缩DP,bitmask vs map+vector (把集合用二进制表示,二进制mask 1<<n)
-
树形 DP (子树天然地形成子问题,需要考虑dp的信息是怎么从子树传给上面的子树的,记忆化搜索,递归。就是我们已经知道以uuu为根的答案,想要通过u−>v的父子关系把答案传递)
-
数位 DP (dfs(int i,int state,bool is_limit,bool is_num)
- 233. 数字 1 的个数【dfs = [&](int i,int cnt,int is_limit)】
- 600. 二进制不含连续1的非负整数【数位DP】
- 902. 最大为 N 的数字组合【dfs = [&](int i,bool is_limit,bool is_num)】
- 1012. 至少有 1 位重复的数字【dfs = [&](int i,int mask,bool is_limit,bool is_num)】
- 2376. 统计特殊整数【dfs = [&](int i,int mask,bool is_limit,bool is_num)】
- 2801. 统计范围内的步进数字数目【dfs = [&](int i,int pre,bool is_limit,bool is_num)->int】
- 2827. 范围中美丽整数的数目
- 2719. 统计整数数目
-
数据结构优化DP
-
倍增和倍增优化DP
-
矩阵快速幂优化DP
-
记忆化搜索 (动态规划,状态优化,求方案数量)
-
- BFS(单源,无权路,权值为1的最短路,O(n))
- Dijkstra(单源,权值为正,O((E)logE))
- Ballmanford (单源,n-1次松驰,,权值可正可负,可用于检测负环,O(V*E))
- Floyd(多源,任意两点的距离,O(n^3))
- 743. 网络延迟时间
- 1334. 阈值距离内邻居最少的城市
- A* 八数码问题
- 2045. 到达目的地的第二短时间
- 1976. 到达目的地的方案数
- 2642. 设计可以求最短路径的图类
- 2065. 最大化一张图中的路径价值
- 2959.关闭分部的可行集合数目
- 3112. 访问消失节点的最少时间
-
最小生成树
-
基环树、内向树、外向树
-
欧拉回路/通路
-
图的连通性
- 1489. 找到最小生成树里的关键边和伪关键边
- 2685. 统计完全连通分量的数量
- 查找集群内的关键连接
- tarjan 求强连通分量 模版
- tarjan 求割点 模版
- tartan 求割边 模版
-
寻找符合条件的路径
-
二分图问题
- 染色分二分图判定是否存在基环,785. 判断二分图
- 二分图最大匹配,匈牙利增广路算法
-
网络流
- 最大流dinic算法
- 最小割
-
- 参加考试的最大学生数
-
- [787. K 站中转内最便宜的航班]
- [788. https://leetcode.cn/problems/possible-bipartition/description/]
- https://www.cnblogs.com/wenruo/p/12357543.html
- leetcode 1595.连通两组点的最小成
- https://leetcode.cn/problems/7rLGCR/description/(守卫城堡)