如果你想參加演算法競賽的建議越早越好。大一或者更早就需要準備起來了。如果你已經快畢業了,那就沒有必要準備了,當做興趣參加一些力扣的比賽也是不錯的。
<!-- more -->
題庫
演算法面試的考察內容相比演算法面試更多,難度也更大。比如數位 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 也推薦了這本書哦。
總結
大家如何想參與演算法競賽儘量趁早,建議至少從大一就開始學習。
建議大家賣一本書系統性學習,然後找個題庫跟著刷題。題庫刷完之後再去參與比賽。比賽完成後可以看下大家的題解,不管自己有沒有做出來,做出來也看看別人的做法是不是更好。經過這樣的一條完整路線,我相信大學期間拿個名次,進個大公司還是不成問題的。當然進大公司還要其他方面也不差才行 ?