|
|
一、基础数据结构及操作
1. 线性结构
数组 / 向量(vector)
核心操作:遍历(for 循环)、元素访问(下标 /at ())、插入(push_back ())、删除(pop_back ())、扩容 / 缩容、多维数组(矩阵)的行 / 列遍历。
应用场景:存储序列数据(如统计数字出现次数、前缀和数组)。
栈(stack)
核心操作:入栈(push ())、出栈(pop ())、取栈顶(top ())、判空(empty ())。
应用场景:括号匹配、表达式求值、单调栈(如求最大矩形面积)。
队列(queue)
核心操作:入队(push ())、出队(pop ())、取队头(front ())、判空(empty ())。
应用场景:BFS 遍历、滑动窗口、模拟排队问题。
链表(单链表 / 双链表)
核心操作:节点创建(new)、插入(前插 / 后插)、删除(释放节点)、遍历(指针移动)。
应用场景:模拟链表反转、环检测(阅读程序题常考指针操作逻辑)。
2. 非线性结构
二叉树(尤其是二叉搜索树 BST)
核心操作:递归遍历(前序 / 中序 / 后序)、迭代遍历(栈辅助)、查找(根据 BST 性质:左小右大)、插入、删除。
应用场景:通过遍历序列还原树结构、判断 BST 合法性(阅读程序题高频)。
堆(优先队列,priority_queue)
核心操作:插入(push ())、取最值(top ())、删除最值(pop ())。
应用场景:TopK 问题(如取前 k 大元素)、堆排序、合并有序序列。
哈希表(unordered_map/unordered_set)
核心操作:插入(insert ())、查找(count ()/find ())、删除(erase ())、键值对访问([])。
应用场景:统计元素出现次数、两数之和(快速查找互补元素)。
二、常用算法及核心逻辑
1. 排序与查找
排序算法
基础排序:冒泡排序(相邻交换)、选择排序(选最值交换)、插入排序(逐个插入有序区)。
高级排序:快速排序(分治 + 基准划分)、归并排序(分治 + 合并有序子列)、堆排序(堆维护)。
核心函数:sort()(C++ STL,默认升序,需理解自定义比较器)。
查找算法
二分查找:在有序数组中查找目标值(需注意边界条件:left <= right 还是 left < right)。
线性查找:遍历数组逐个匹配(适用于无序数据)。
2. 递归与分治
递归基础:阶乘计算、斐波那契数列(含优化:记忆化递归)、汉诺塔问题。
分治思想:归并排序(分拆 + 合并)、快速排序(基准划分)、大整数乘法(拆分计算)。
核心逻辑:递归终止条件(base case)、子问题拆分、结果合并。
3. 动态规划(DP)
经典问题:
一维 DP:最长递增子序列(LIS)、爬楼梯(斐波那契变种)。
二维 DP:最长公共子序列(LCS)、0-1 背包(状态转移:dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]))、矩阵路径(求从左上角到右下角的路径和)。
核心逻辑:状态定义、转移方程、初始化(边界条件)。
4. 贪心算法
典型场景:区间调度(选最多不重叠区间)、 Huffman 编码(构建最优前缀码)、找零问题(优先用大面额硬币)。
核心逻辑:局部最优决策(需证明其能导出全局最优)。
5. 图论基础
遍历算法:
DFS(深度优先搜索):递归或栈实现,用于连通性判断、路径查找(如迷宫求解)。
BFS(广度优先搜索):队列实现,用于最短路径(无权图)、层次遍历。
最短路:Dijkstra 算法(单源最短路,适用于非负权图,优先队列实现)。
6. 字符串处理
核心操作:
字符串遍历(按字符访问)、拼接(+ 或 append())、子串提取(substr(pos, len))。
字符统计(用数组 / 哈希表记录每个字符出现次数)。
字符串匹配:KMP 算法(部分匹配表 / 前缀函数的构建与应用)。
三、数学相关算法
数论基础:
素数判断(试除法:检查 2 到√n 的约数)。
最大公约数(gcd,辗转相除法:gcd(a,b) = gcd(b,a%b))、最小公倍数(lcm,lcm(a,b) = a*b/gcd(a,b))。
快速幂(模运算优化:a^b % mod,分治思想减少乘法次数)。
前缀和与差分:
前缀和:快速计算区间和(sum[l..r] = pre[r] - pre[l-1])。
差分:快速实现区间增减(diff[l] += x, diff[r+1] -= x,再求前缀和还原数组)。
四、C++ STL 高频函数
输入输出:cin/cout、scanf/printf(注意格式控制,如%d、%s)。
算法库(algorithm):sort()(排序)、swap()(交换)、max/min(取最值)、reverse()(反转序列)、lower_bound/upper_bound(二分查找)。
容器:vector(动态数组)、string(字符串)、stack(栈)、queue(队列)、priority_queue(堆)、map/set(有序映射 / 集合)。 |
|