算法面试常考leetcode模版总结--dfs、回溯、单调栈模板、二分法、排序(快速排序,归并排序)总结

本文总结了算法面试中常见的dfs、回溯、单调栈模板,以及单源最短路径Dijkstra算法。同时详细介绍了二分法在查找相同值时的应用,并探讨了原地修改的快速排序和归并排序方法,对它们的时间和空间复杂度进行了分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板

dfs

回溯法

三个核心要素:路径、选择列表、结束条件

result = []
路径 = []
def backtrack(ind):
	if ind 最后一个:
		res.append(路径)
		return 
	for 选择 in 选择列表:
		做选择
		backtrack(ind+1)
		撤销选择

单调栈

遇到比栈顶大的元素,直接append,
遇到比栈顶小的元素,找到合适的位置,替换。

单源最短路径Digkstra

节点分成两类:(1)已经确定距离的节点 (2)没有确定的节点
每次从未确定的节点中选择一个与起点距离最点的点,然后更新从起点到其他所有未确定节点的距离。

二分法

二分法查找相同值取最右边的插入位置

def bisect_right(a, x, lo=0, hi=None):
    """Return the index where to insert item x in list a, assuming a is sorted.

    The return value i is such that all e in a[:i] have e <= x, and all e in
    a[i:] have e > x.  So if x already appears in the list, a.insert(x) will
    insert just after the rightmost x already there.

    Optional args lo (default 0) and hi (default len(a)) bound the
    slice of a to be searched.
    """

    if lo < 0:
        raise ValueError('lo must be non-negative')
    if hi is None:
        hi = 
<think>嗯,用户需要快速学习一些算法数据结构,用于C++比赛。他们列出的内容挺多的,枚举、排序、搜索、贪心等等,还有图论数学相关的内容。首先,我得确定用户的背景。可能是个刚开始参加编程竞赛的学生,需要系统地复习这些常见的算法数据结构,可能在准备蓝桥杯、ACM之类的比赛。 用户提到的“快速性学习”可能意味着他们时间紧迫,需要高效掌握这些知识点。所以,回答要结构清晰,分点介绍每个主题的核心概念、应用场景以及C++的实现技巧。同时,用户需要实际打比赛的例子,所以代码示例优化技巧会很关键。 接下来,每个部分需要简要但足够详细。比如枚举,要说明其适用情况,优缺点。排序算法部分,用户已经提到了冒泡、选择、插入,还有归并快排。需要区分基础排序更高效的排序,给出时间复杂度适用场景。 搜索方面,BFSDFS区别应用,比如最短路径用BFS,回溯DFS。记忆化搜索通常动态规划结合,可能需要例子说明。贪心模拟相对容易,但贪心的正确性需要强调,可能需要举经典题目例子。 二分查找高精度处理是比赛中常见的考点,特别是高精度在数据范围大时的处理,比如用数组存储各位数字。数据结构中的、队列、ST表需要给出实现方式典型应用,比如ST表用于区间最值查询。 图论中的最近共同祖先(LCA)是较高级的内容,需要介绍倍增法或Tarjan算法,但可能只需简要说明原理实现步骤。数学部分如容斥原理,要举例说明应用场景,比如集合计数问题。 还要注意C++中的STL应用,比如用sort函数实现快速排序,使用队列的标准库,避免重复造轮子。同时,提醒一些常见错误,比如二分查找的边界条件,高精度计算的进位处理,递归搜索的终止条件等。 最后,总结部分需要强调练习题目的重要性,建议用户通过刷题巩固,并推荐一些经典题目或在线评测平台。可能需要检查是否有遗漏的知识点,确保覆盖用户提到的所有内容,同时保持回答的条理性,方便用户快速查阅复习。</think>我将以算法竞赛常用知识点为框架,为您整理C++算法竞赛快速学习指南。以下内容按照知识体系分层讲解,并提供关键代码模板: ### 一、基础算法 1. **枚举算法** - 特点:暴力遍历所有可能解 - 优化方向:剪枝、状态压缩 - 示例:求n位数中各位立方等于原数的数 ```cpp for(int i=pow(10,n-1); i<pow(10,n); ++i){ int sum=0, tmp=i; while(tmp){ sum += pow(tmp%10,3); tmp /= 10; } if(sum == i) cout<<i<<endl; } ``` 2. **基础排序** - 冒泡排序:稳定,$O(n^2)$ ```cpp for(int i=0; i<n-1; ++i) for(int j=0; j<n-1-i; ++j) if(a[j]>a[j+1]) swap(a[j],a[j+1]); ``` - 选择排序:不稳定,$O(n^2)$ - 插入排序:稳定,适合小规模数据 3. **二分查找** - 核心:有序性、边界处理 - 代码框架: ```cpp int l=0, r=n-1; while(l<=r){ int mid = l + (r-l)/2; if(check(mid)) r=mid-1; else l=mid+1; } return l; ``` ### 二、进阶算法 1. **高效排序** - 快速排序:分治思想,平均$O(n\log n)$ ```cpp void qsort(int l, int r){ if(l >= r) return; int i=l-1, j=r+1, x=a[(l+r)>>1]; while(i < j){ do i++; while(a[i]<x); do j--; while(a[j]>x); if(i<j) swap(a[i],a[j]); } qsort(l,j), qsort(j+1,r); } ``` - 归并排序:稳定,适合外部排序 2. **搜索算法** - BFS:队列实现,最短路径问题 ```cpp queue<Node> q; q.push(start); while(!q.empty()){ auto t = q.front(); q.pop(); for(所有相邻节点){ if(未访问) q.push(节点), 标记访问 } } ``` - DFS:递归/实现,回溯法基础 - 记忆化搜索:DP的递归实现形式 3. **贪心算法** - 特性:局部最优推导全局最优 - 经典应用:区间调度、哈夫曼编码 ### 三、数据结构 1. **线性结构** - :后进先出,括号匹配问题 - 队列:先进先出,BFS实现基础 - ST表:解决RMQ问题,$O(n\log n)$预处理,$O(1)$查询 ```cpp int st[MAXN][20]; // st[i][j]表示区间[i,i+2^j-1]的最值 void build(){ for(int j=1; (1<<j)<=n; ++j) for(int i=1; i+(1<<j)-1<=n; ++i) st[i][j] = max(st[i][j-1], st[i+(1<<(j-1))][j-1]); } int query(int l, int r){ int k = log2(r-l+1); return max(st[l][k], st[r-(1<<k)+1][k]); } ``` ### 四、数学与图论 1. **高精度计算** - 实现方式:数组存储各位数字 - 核心操作:进位处理、前导零去除 2. **容斥原理** - 公式:$|A∪B∪C| = |A|+|B|+|C| - |A∩B| - |A∩C| - |B∩C| + |A∩B∩C|$ - 应用:求1-n中能被质数集合整除的数的个数 3. **最近公共祖先(LCA)** - 倍增法实现步骤: 1. 预处理每个节点的$2^k$级祖先 2. 通过二分法调整节点深度 3. 同步上跳查找公共祖先 ### 五、实战技巧 1. **代码模板化**:整理常用算法模板 2. **复杂度分析**:快速估算算法可行性 3. **STL应用**: - `sort()`(快速排序实现) - `priority_queue`(堆实现) - `lower_bound()`(二分查找) 4. **调试技巧**: - 边界测试:0值、极大值 - 中间输出调试 - 使用assert进行断言检查 ### 六、学习路线建议 1. 基础阶段(2周): - 掌握排序、查找、简单数据结构 - 熟悉基础语法输入输出处理 2. 提高阶段(3周): - 攻克动态规划、图论基础 - 练习经典算法题(如背包问题、最短路) 3. 冲刺阶段(2周): - 专题突破薄弱环节 - 参加模拟赛训练速度 建议练习平台:洛谷(www.luogu.com.cn)、Codeforces、LeetCode 注:实际代码实现时需注意数据范围判断异常处理。算法竞赛中应优先保证核心逻辑正确性,再优化代码效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值