
简介这份算法题合集收录了源自芬兰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道核心题其余题目变成了索引里的背景音需要时按标签回溯就能找到。从那以后我每次拿到新的题集都会强制自己先做题型分布表再筛题再定时间线最后用标签回溯收尾。这套流程不会让你的水平暴涨但能保证每一遍刷题都不走回头路。希望帮到你。本文还有配套的精品资源点击获取