简介:这份算法题合集收录了源自芬兰OI训练平台CSES的约300道经典题目,主要面向ACM竞赛选手、算法面试求职者以及希望系统提升编程能力的学习者。考虑到部分用户访问CSES官网存在不便,资源将全部题目整理成一份离线PDF文档,包含清晰的问题描述、输入输出格式与样例测试用例,可随时下载打印或存入设备离线查阅。
包内共1个PDF文件,整体大小为31.43MB,轻量便于携带。题目覆盖数据结构、排序与搜索、图论、动态规划、贪心策略等多个核心算法方向,既能用于赛前强化训练,也适合按专题查漏补缺。每道题可在VJudge等在线评测平台提交验证,并附有GitHub上的题解仓库链接,方便对照不同实现、优化思路并复盘总结。
目前已有255人下载学习,对需要大量刷题、积累解题模型并突破算法瓶颈的读者来说,是一份兼顾离线查阅与在线验证的高性价比题库。
1. 算法300题不是“题目大全”,而是一份等待你拆解的作战地图
下载过“算法300题”PDF的人,大概率都有一个共同的体验:翻目录花了半小时,然后对着密密麻麻的题目陷入选择困难。这类题库真正稀缺的不是“题目数量”,而是“题目结构”。它能解决的是“该刷哪些题、按什么顺序刷、把时间花在哪一类题上”——这比单题解法更决定你的上限。适合三类人:刚开始刷题、靠它备赛ACM的大学生;笔试前想快速过一遍核心考点的求职者;还有需要给学生做训练规划的技术社团带教。记住一件事:这是一张地图,不是一本书,地图要用来走路,而不是用来阅读。
2. 按题型拆解300题:先分清竞赛题与面试题再做取舍
拿到PDF,我一般会先花一晚上把整份目录过一遍,然后画一张题型分布表。这类题库的常见编排是分五大块:数据结构、算法思想、数学与字符串、图论、思维与模拟。为什么要分这五类?因为ACM竞赛题和面试题的交集恰好落在“数据结构+算法思想”这两个大类上,图论和数学题更偏向竞赛,思维与模拟则是两头通吃。先把大类弄明白,才知道自己该在哪一块砸时间。
| 类别 | 占比(300题版常见) | 典型标签 | 竞赛权重 | 面试权重 |
|---|---|---|---|---|
| 数据结构 | 25%左右 | 数组、栈与单调栈、树、并查集、堆 | ★★ | ★★★★★ |
| 算法思想 | 30%左右 | 暴力枚举、剪枝、贪心、回溯、动态规划、分治 | ★★★★ | ★★★★★ |
| 数学与字符串 | 15%左右 | 数论、进制、KMP、字符串哈希 | ★★★ | ★★★ |
| 图论 | 20%左右 | 最短路、最小生成树、拓扑排序、匈牙利算法、A* | ★★★★★ | ★★ |
| 思维与模拟 | 10%左右 | 找规律、构造、经典脑筋题 | ★★★ | ★★★ |
注意一个细节:不同版本的300题PDF,各类别占比会浮动,但“数据结构+算法思想”合起来超过50%是通用规律。如果你拿到的版本里图论占了三成以上,那大概率是竞赛整理版;如果堆、单调栈、双指针这类题明显偏多,那就是面试向的版本。这个判断直接影响后面的刷题计划,值得花一晚看清。
2.1 先看懂分类逻辑,别被“题目大全”四个字带偏
这类题集的分类方式和ACM训练营的课程大纲几乎同构:数据结构解决“用什么装数据”,算法思想解决“怎么算得快”,数学与字符串是特殊套路库,图论是竞赛主力,思维题负责锻炼抽象能力。分类最大的陷阱是:你直接从第一类开始走,结果走进数据结构的深水区出不来。
我的经验是,分类的意义不是让你从头到尾顺一遍,而是让你知道“哪一类属于自己当前的目标”。拿到题集后我会做三件事:第一,在每一类开头写下目标,面试只选面试权重高的类别;第二,把每一类的第一题当作该类难度下限,记录“第一遍能否在10分钟内看懂题解”;第三,用这个结果决定第一轮刷题顺序。
这套动作看起来很基础,但很多人跳过它直接开刷,结果就是一个月后发现自己刷了一堆不考的题。
2.2 算法思想核心:从暴力枚举到动态规划的递进路线
打开算法思想这一章,目录顺序通常就是暴力枚举与剪枝、贪心算法、回溯法、动态规划、分治法。这个顺序不是排版巧合,而是依赖链条。暴力枚举是一切算法思维的起点,它逼你先定义“解空间长什么样”;剪枝负责在搜索树里砍掉荒谬分支;贪心则是在枚举上叠加“局部最优”的决策规则;回溯是在搜索树上做系统化遍历;动态规划则是对重叠子问题的记忆化改造。一步步拆,越到后面抽象程度越高。
具体操作分四轮。第一轮,把PDF中算法思想里所有“暴力枚举”开头的题全部挑出,连续做10道,每道先把解空间写出来,哪怕只是注释里的一行循环范围描述。第二轮,加入剪枝题,观察哪些题在枚举基础上减少循环次数,比较剪枝前后的复杂度差异。第三轮,进入回溯模板题,套用标准回溯框架(路径、选择列表、终止条件),不掺杂其他技巧。第四轮,把动态规划题全部挑出,先别看状态转移方程,自己用暴力枚举先写一遍,再对比DP解法。
为什么强调这个顺序?因为有太多次翻车经历告诉我,跳过枚举直接看动态规划的人,多半会把状态转移方程当成玄学来背。而你自己从暴力版本推导出DP版本时,那层窗户纸才算真正捅破。
2.3 数据结构部分:数组技巧、单调栈、并查集是性价比之王
面试场景里,数据结构题的性价比排名很清晰:第一是数组技巧,包括双指针、前缀和、摩尔投票;第二是单调栈,经典案例是“找下一个身高更高的小朋友”;第三是并查集,处理连通性判断。PDF里常见的排序算法(冒泡、堆排序、归并排序)更多出现在笔试手写题中,属于“必须会默写,但不需要刷很多题”的类型。
| 标签 | 常见题量(300题版) | 面试出现概率 | 训练价值 |
|---|---|---|---|
| 双指针 / 前缀和 | 10题左右 | 高 | 高 |
| 单调栈 / 单调队列 | 5题左右 | 高 | 高 |
| 并查集 | 4题左右 | 中 | 高 |
| 堆 / 优先队列 | 6题左右 | 中 | 中 |
| 线段树 / 树状数组 | 8题左右 | 低 | 竞赛向 |
为什么这三样权重最高?因为代码量小但思维密集,适合面试官在45分钟内考察,也容易在笔试里当开胃菜。线段树、平衡树这类代码量大的结构,笔试面试很多场景直接允许用现成容器,所以优先级反而不高。具体做法是:在PDF数据结构章节中找出所有带这些标签的题,按上表数量统计,优先把出现次数最多的标签做掉,出现次数少的先跳过。这样两周内就能把数据结构这块的骨架立起来。
2.4 图论与思维题:竞赛选手的深水池,面试党的隐形坑
图论和数学题在ACM竞赛里是重头戏,但在普通求职面试里被考到的概率低得多。竞赛选手会花时间啃匈牙利算法、最短路、最小生成树、拓扑排序,还会去研究A*搜索这类进阶内容;面试党如果也这么干,很容易掉进“刷了很多难题,但基础题反而手生”的坑。
判断一份题集是不是竞赛向,看两点:图论章节占比是不是超过20%,数学与字符串里是不是大量出现数论和高级字符串算法。如果是,求职党要主动把精力挪到数据结构和算法思想两块。竞赛选手则可以把这个章节当作训练场,每天安排20%的时间在图论上,配合完整程序实现。思维题我一般当作调剂品,工作日太累的时候做两道,保持大脑活跃,不把它当主线。
3. 把PDF变成可执行的刷题计划:时间线、优先级与自测指标
刷到一半放弃的人,往往是从第1题按顺序做到第40题时放弃的。这类大而全的PDF最大的问题是没有优先级。拿到题集之后的第一个动作,不该是打开第一题,而是先定计划。下面这套流程我复现过至少三次,能把你从300题的泥潭里拉出来。
3.1 先自测:30分钟写出中档题才算真的会
不要相信PDF自带的难度标注,先用自己的水平实测。操作方式:从五个大类里各抽出4道中档题,一共20道;每道题限时30分钟,写完整可运行的代码,然后记录能否通过测试样例;最后统计通过率。这里的“通过”指代码能处理至少三组自己构造的边界数据,不只是样例跑通。
| 通过率 | 熟练度 | 建议路线 |
|---|---|---|
| 80%及以上 | 有基础 | 直接进入核心60题 |
| 40%到80% | 有一定基础但漏洞多 | 按类别补齐,每天一类 |
| 40%以下 | 新手期 | 先刷暴力枚举与剪枝,再碰数据结构 |
这个自测表最大的价值,是帮你把“我感觉自己还行”变成“我实际能写对”。很多题集里的题你看题解秒懂,但限时写就不行,自测会撕掉这层错觉。
3.2 三种人群、三条时间线:赛前、面试、零基础
不同目标的人,时间线完全不同。ACM赛前需要速度和正确率,所以每日题量要大,还要有全真模拟;求职笔试需要覆盖面,所以主攻高频模板题;零基础需要把知识树先建起来,慢慢来反而快。
| 人群 | 周期 | 每日题量 | 重点方向 |
|---|---|---|---|
| ACM赛前 | 一个月 | 8到10道 | 算法思想+图论+数学,隔天全真模拟 |
| 求职笔试 | 两周 | 10道左右 | 数据结构+算法思想,主攻模板题 |
| 零基础 | 三个月 | 4到5道 | 先暴力枚举与剪枝,再数据结构 |
我一般会给自己设定“核心题3道+复盘题5道”的组合:核心题要求不看题解写出AC,复盘题只回顾思路和易错点。一周里抽一天不刷新题,只重刷错题。这个习惯帮我省掉了很多回头重学的时间,算是给自己买的后悔药。
提示:时间线可以浮动,但“定期重刷错题”不能省,它是整个计划里唯一不可压缩的部分。
3.3 从300题里抽出核心60题:可复用的筛选准则
核心60题的定义是“覆盖所有常考知识点的最小集”,不是“最简单的60题”。筛选方法分四步。第一步,每个类别只保留题目描述里带“模板”“经典”“高频”字样的题。第二步,同类型题只保留一道,比如5道单调栈题只留1道做精学。第三步,删掉你一眼就能写出答案的题,这种题已经是你的舒适区。第四步,如果某类剩余题数超过15道,再砍一半。
筛完之后,面试向的核心60题大致分布是:数据结构25道、算法思想25道、字符串5道、图论5道。竞赛向则是:数据结构15道、算法思想20道、图论15道、数学与字符串10道。这套分布不是绝对标准,但它保证每个常考知识点都有一道题作为锚点。筛题的过程也是再读一遍目录的过程,你会在里面发现很多之前没注意到的细节,比如某些看似冷门的标签,其实连着出现好几道题。
4. 笔试与面试实战:把题目清单转化成答题框架
题集里的题是静态的,笔试面试中的题是动态的。很多人刷完题集成绩依旧不行,原因不是题量不够,而是没有把题解翻译成自己的答题流程。我习惯把300题当成一个“套路池”,每次做题前先在草稿纸上写四个词:复杂度、状态、优化、边界。
4.1 笔试脱马甲:裸题直接套模板,包装题先找题眼
笔试场景里题目五花八门,但内核逃不出题集里的套路。最常见的是包装题:题面讲一个故事,本质却是某个经典模型。比如“找下一个身高更高的小朋友”就是单调栈的包装题,题眼是“下一个更大”;“数组里出现次数超过一半的元素”就是摩尔投票法;“最长公共子序列”就是二维动态规划。
破解包装题的关键是读题后先圈输入规模:数据规模到了10^5以上,基本排除O(n²)的暴力方案;然后找“相邻、下一个、连续、子序列、区间最值”这类关键词;再在草稿上写出对应的裸题原型,套上题集里的模板。多做几轮之后你会发现,包装题只是换了件衣服,里面的骨架还是那些经典模型。
4.2 面试答题四步框架:定复杂度、选状态、说优化、查边界
面试和笔试不同,面试官看的不是最终代码,而是思考过程。我常用的答题框架是四步走:
| 步骤 | 做什么 | 对应题集知识点 |
|---|---|---|
| 定复杂度 | 根据数据范围确定算法级别 | 时间复杂度分析 |
| 选状态 | 确定用什么数据结构:数组、栈、哈希、并查集 | 数据结构章节 |
| 说优化 | 先说暴力枚举方案,再逐步优化 | 暴力枚举与剪枝 |
| 查边界 | 空数组、单元素、溢出、越界 | 模拟与思维题 |
第一步先看数据范围,数据量小就直接给暴力枚举方案,数据量大则提出更有针对性的结构。第二步说清楚为什么选这个数据结构,哪怕只是“因为需要快速查找前一个更小元素,我用单调栈”。第三步很关键,先说自己能想到的暴力版本,再去优化,面试官反而更认可这种路径。第四步把边界条件列一遍,空数组、只有一个元素、结果溢出,这些细节往往比算法本身更容易扣分。
4.3 竞赛题与面试题的三个差异:先确认别刷错方向
这份300题PDF里可能同时包含竞赛题和面试题,刷之前要分清。第一个差异是输入输出方式:ACM题经常要用文件输入或特殊格式,面试机考一般就是常规输入输出,只刷竞赛题的人连“读一整行带空格的字符串”都可能写不顺手。第二个差异是时间限制:ACM喜欢卡常数、卡内存,面试更看重代码可读性和可维护性。第三个差异是判题方式:ACM只有AC和WA,面试会有多轮追问、代码走读和思路阐述。
很多竞赛选手在笔试中翻车,就是因为他们习惯只写核心函数,忽略了完整程序的健壮性。反过来,只刷面试题的人去参加ACM,也会被图论和数学题打得措手不及。所以拿到题集第一步的判断就变得特别重要:你想去哪,就刷哪个方向。
5. 刷这套题集的避坑记录:四个翻车点与排查方法
这套300题我前后刷了两遍,第一遍因为方法不对,四个月只推进了不到80题;第二遍换策略,两个月搞定了核心题。把中间踩过的坑整理成四条避坑记录,每一条都是先描述现象再给排查方法,希望能帮你绕开我走过的弯路。
5.1 按目录从头刷,一个月后还停在第一类
现象:买回来第一天就打开目录第1题,一周后还在数据结构章里打转,甚至开始怀疑智商。
原因:题集为追求覆盖度,目录是把难度和类别混合排序的,它不是学习路径。第一类可能是线性表进阶,也可能是图论难题,按顺序刷等于被出题人牵着走。
解决:先花一晚上做第3章的自测和筛选,把300题重排成“核心60题+扩展题+放弃题”三档,再开始刷。目录只是索引,不是路线图。
5.2 只刷核心函数不写完整程序,一到笔试就白卷
现象:在PDF上看题解都懂,笔试上机时,建数组、读输入、处理多组测试全乱,最后连暴力枚举都没写完整。
原因:PDF里很多题解只给算法核心代码,省略了输入输出、边界处理和main函数。长期只看核心代码,会造成“不带壳”的盲区。
解决:每天用30分钟专门做“把核心代码包装成完整程序”的练习。把PDF里每个模板题改成可编译、可运行、能造数据测试的完整代码,跑通三组边界数据才算过。
5.3 看题解秒懂,合上PDF后一行代码都写不出来
现象:看完题解觉得“原来如此”,第二天让你重写一遍,什么也想不起来,连状态转移方程都记不全。
原因:缺少重建过程,你只是记住了答案的结论,没有参与推导。尤其是动态规划,直接看题解等于把关键的思考过程外包给了别人。
解决:用“回滚式复现”刷题。第一遍先写暴力枚举版本,第二遍在暴力版本上加剪枝,第三遍再看题解补最优解。对动态规划和贪心这类抽象题目,这个方法特别有效。
5.4 难度标注是玄学,按自己的通过率重新分级
现象:PDF里标注“简单”的题卡了两小时,“困难”的题反而一看就有思路。
原因:难度标注是出题人的主观感受,它的参照系是平均水平,对你这个个体不适用。有些题对A类是难题,对B类只是套路题。
解决:自建难度体系。第一遍做的时候,无论标注什么,都用三档重新标:能AC、能看懂但写不出、完全看不懂。两周后按这个新难度表重刷。说到底,刷题节奏本来就是一门玄学,别用别人的尺度定义自己的能力边界。
6. 把300题压缩成一棵知识树:标签回溯与错题本实践
所有刷题方法落到最后,都是关于“复盘”这件事的。我一直在用的技巧叫“标签回溯法”:刷题的时候顺手给每一道题贴三个标签,一周后回来重刷。标签分三维:类别标签(数据结构、算法思想、图论),考点标签(单调栈、前缀和、KMP、动态规划),易错标签(边界、溢出、读入格式)。
| 题目标签 | 考点 | 易错点 | 重刷时间 |
|---|---|---|---|
| 找下一个身高更高的小朋友 | 单调栈 | 出栈时更新结果 | 第3天 |
| 出现次数超过一半的元素 | 摩尔投票 | 计数重置后要二次验证 | 第7天 |
具体操作分三步。第一,每做完一题,在PDF目录旁边手写三个标签,写不出的标签说明这道题还没学透。第二,每周日把本周标签汇总到表格里,按考点分组,考点重复多的就是你近期的主攻方向。第三,重刷时只看标签不看题解,如果5分钟内想不起思路,就加入“必须重做”清单,下周继续。
这一招的本质,是把别人的题库变成自己的索引。那本300题的PDF最后被我刷完的只有70道核心题,其余题目变成了索引里的背景音,需要时按标签回溯就能找到。从那以后,我每次拿到新的题集,都会强制自己先做题型分布表,再筛题,再定时间线,最后用标签回溯收尾。这套流程不会让你的水平暴涨,但能保证每一遍刷题都不走回头路。希望帮到你。
本文还有配套的精品资源,点击获取