如果你想参加算法竞赛的建议越早越好。大一或者更早就需要准备起来了。如果你已经快毕业了,那就没有必要准备了,当做兴趣参加一些力扣的比赛也是不错的。
题库
算法面试的考察内容相比算法面试更多,难度也更大。比如数位 dp,倍增,乘法逆元都需要掌握。而这些内容在算法面试中出现的却不多。
题库的话有很多 OJ 网站。但是题目都太多了。
这里推荐两个网站,一个适合竞赛选手,一个适合普通求职者。
CSES 这个网站比较适合竞赛选手,题目有 300 道,刷完还是比较快的(相对于其他老牌 OJ 平台),地址:https://cses.fi/problemset/
另外一个是 BinarySearch。用户体验做的很好,题目难度和力扣差不多,难度波动感觉比力扣小一点点,地址:binarysearch.com/
练手比赛
姑且先推荐三个平台吧。
其中一个是 codeforces, 这个参与竞赛的人知道的比较多, codeforces 是全球范围内每次比赛参加人数最多的竞赛平台。普通人可能不太知道。这个网站的比较难度偏大一点,质量也更高。打过的人都知道。
第二个是 Leetcode。这个大家可能听说过。目前力扣有两种赛事。
- 周赛:每周日早上 10:30
- 双周赛:每两周一次,北京时间周六的晚上 10:30开始
力扣的难度比较入门,适合新手。不过难度波动其实也不小,难度低的时不时是手速场,难度高的话只要能做出来(即使是卡点做出来)都能进前 100。
最后推荐一个是 Google 比赛,有三个等级。
- Kick Start:新手入门级,也是Google面试的敲门砖,每年举办八轮。
- Code Jam :Google的王牌赛事,也是最重要的赛事,分为资格赛、A轮、B轮、C轮和决赛。决赛每年有25个名额。
- Hash Code:一项团队赛,与一般编程竞赛不同,赛题一般为没有最优答案的优化问题。分为资格赛和决赛两轮。
学习网站
OI wiki 是一个内容比较全,深度也覆盖比赛的网站。里面的内容大概看了下,大部分不错,少部分是从网上抄的,质量也一般。如果你有一定的鉴别能力,这个网站是非常不错的。地址:https://oi-wiki.org/
比如图论的 OI-wiki 目录是这样的:
CP-Wiki 是个人的 Competitive Programming 学习资料总结。里面不仅有各个知识点的总结。
知识总结是大纲性质的,比较简略,适合拿来查缺补漏。
而且还有各个比赛的题解,强烈建议学习竞赛的你收藏。
学习图书
《算法竞赛进阶指南》
推荐阅读李煜东的《算法竞赛进阶指南》。他有丰富的参与竞赛以及培训竞赛的经验,同时他也是 Google 的工程师。
李煜东曾为NOI系列竞赛、NOI导刊培训基地以及全国各地多所学校的选手授课,并在网络上组织模拟赛数十场,经验丰富、讲解透彻、广受好评。多次协助石家庄市第二中学的信息学竞赛集训工作,参与北京大学“数据结构与算法”、“算法设计与分析”的课程教学、考试命题工作。
豆瓣评分 9.1 ,群众的眼睛还是雪亮的!
这种书在算法竞赛中知名度还是很高的。你如果准备算法面试的话可能听说过。 如果没有听说过,现在不妨买来看看。
附上这种书的目录给大家:
0x00 基本算法
0x01 位运算
0x02 枚举、模拟、递推
0x03 递归
0x04 二分
0x05 排序
0x06 倍增
0x07 贪心
0x08 总结与练习
0x10 基本数据结构
0x11 栈
0x12 队列
0x13 链表与邻接表
0x14 Hash
0x15 字符串
0x16 Trie
0x17 二叉堆
0x18 总结与练习
0x20 搜索
0x21 树与图的遍历
0x22 深度优先捜索
0x23 剪枝
0x24 迭代加深
0x25 广度优先捜索
0x26 广捜变形
0x27 A*
0x28 IDA*
0x29 总结与练习
0x30 数学知识
0x31 质数
0x32 约数
0x33 同余
0x34 矩阵乘法
0x35 高斯消元与线性空间
0x36 组合计数
0x37 容斥原理与Möbius函数
0x38 概率与数学期望
0x39 0/1分数规划
0x3A 博弈论之SG函数
0x3B 总结与练习
0x40 数据结构进阶
0x41 并査集
0x42 树状数组
0x43 线段树
0x44 分块
0x45 点分治
0x46 二叉査找树与平衡树初步
0x47 总结与练习
0x50 动态规划
0x51 线性DP
0x52 背包
0x53 区间DP
0x54 树形DP
0x55 环形与后效性处理
0x56 状态压缩DP
0x57 倍增优化DP
0x58 数据结构优化DP
0x59 单调队列优化DP
0x5A 斜率优化
0x5B 四边形不等式
0x5C 计数类DP
0x5D 数位统计DP
0x5E 总结与练习
0x60 图论
0x61 最短路
0x62 最小生成树
0x63 树的直径与最近公共祖先
0x64 基环树
0x65 负环与差分约束
0x66 Tarjan算法与无向图连通性
0x67 Tarjan算法与有向图连通性
0x68 二分图的匹配
0x69 二分图的覆盖与独立集
0x6A 网络流初步
0x6B 总结与练习
0x70 综合技巧与实践
0x71 C++ STL
0x72 随机数据生成与对拍
0x7F 附录
如果你不打算参与算法竞赛,我也建议你买过来看看,不过内容可以选择性看看即可。如果你也不知道应该看哪部分,可以在我的交流群中进行讨论,公众号力扣加加回复 leetcode 进群。
《Guide to Competitive Programming》
《Guide to Competitive Programming》这种书我自己没有读过。不过听朋友说内容不错,大家可以试读一下,看看目录是否适合自己。
BTW,前面提到的题库网站 CSES 也推荐了这本书哦。
总结
大家如何想参与算法竞赛尽量趁早,建议至少从大一就开始学习。
建议大家卖一本书系统性学习,然后找个题库跟着刷题。题库刷完之后再去参与比赛。比赛完成后可以看下大家的题解,不管自己有没有做出来,做出来也看看别人的做法是不是更好。经过这样的一条完整路线,我相信大学期间拿个名次,进个大公司还是不成问题的。当然进大公司还要其他方面也不差才行