从零开始的算法练习

这个篇章希望记录我从零开始学和刷算法题目的过程,刷了什么题目,看了什么资料,按什么顺序,一些题的笔记,以及每个阶段的成果。

Table of Contents

简介

这个篇章希望记录我从零开始学和刷算法题目的过程,刷了什么题目,看了什么资料,按什么顺序,一些题的笔记,以及每个阶段的成果。希望能对其它有一样目标的人有所帮助。

个人背景

先大概介绍以下我个人的背景,我本科的 Department 是一个排名不错,但是教课很一般的系。所以即便我在本科的 Data Structure 和 Algorithm 两门课都取得了不错的成绩,但是我觉得自己在算法上基本上没有学到太多东西。而且我开始写这个 blog 的时候连 Coding 都有点生疏了。

我还刚试了2021的 Google Code Jam Qualification Round, 能做出一二题,以及暴力出第三题的 test set 1 的程度。相信这个可以给你一个很好的初始水平参考。

开始

我先看了 William Lin 的这个视频,觉得很有帮助:
Starting Competitive Programming – Steps and Mistakes

一开始我打算先在HackerRank上做做 Python 的题目先,当是对 Python 的一个复习。因为我有点强迫症,所以很简单的题我也会顺便做,但我觉得还是蛮有复习的作用的,也更符合从零开始练吧哈哈。

接下来的题目,会按照我做的顺序进行排序,也就是更符合循序渐进的原则。每道题的展示格式是:
[#顺序] [题目名称] [来源] [笔记(可能有)]。题目来源会尽量用颜色区分,这样之后可以更好的看出,我在不同阶段的主要做题平台。针对一些特别的题或者概念,我会写一篇笔记。

从 HackerRank 开始

#1 Say Hello, World! With Python (HackerRank)
#2. Python If-Else (HackerRank)
#3. Arithmetic Operators (HackerRank)
#4. Python: Division (HackerRank)
#5. Loops (HackerRank)
#6. Write a function (HackerRank)
#7. Print Function (HackerRank)
#8. List Comprehensions (HackerRank)(笔记)
#9. Find the Runner-Up Score! (HackerRank)
#10. Nested Lists (HackerRank)(笔记)
#11. Lists (HackerRank)
#12. Tuples (HackerRank)
#13. sWAP cASE (HackerRank)
#14. Finding the percentage (HackerRank)
#15. What’s Your Name? (HackerRank)
#16. Mutations (HackerRank)

最近在看 Dan Bader 的《Python Tricks: A Buffet of Awesome Python Features》。刚看到第二章,对 Assert 有了更深的理解。写了一篇新的笔记:

而为了完全理解第二章的 With ,我又去看了第三章的 First-Class Functions,觉得搞清了一些一直不太清楚的概念:

又先继续刷刷题:
#17. Find a string (HackerRank) (笔记)
#18. String Validators (HackerRank) (笔记)
#19. Text Wrap (HackerRank)
#20. Designer Door Mat (HackerRank) (笔记)
#21. String Formatting (HackerRank) (笔记)
#22. Alphabet Rangoli (HackerRank) (笔记)
#23. Capitalize! (HackerRank) (笔记)
#24. The Minion Game (HackerRank) (笔记)
#25. Merge the Tools! (HackerRank)(笔记)

Youtube 学 DP 和 Structy 阶段

2022 年 8月28日 (从现在开始记录一下特殊时间点哈哈)

大概花了4天看完了 freecodecamp 由 Alvin 讲的 Dynamic Programming 视频,真的解释得蛮棒的!唯一的小瑕疵就是时间复杂度那没有比较严谨的证明,和没有对应的习题可以试一下,不过真的让我对 DP 的概念清晰了很多。

2022 年 8月29日到30日

因为这位 Alvin 实在讲得太好,我去买了他的课程,https://structy.net/ ,两天刷完了 29% 😂 ,包括了 Array,String 和 Linked List,还剩下 Binary Tree,Graph 和 DP 的课程和题目。

我还一直有用了一个软件,追踪我在每个 app 上花费的时间,所以大概是两天每天7,8个小时在学习,总共刷完 20 多道题。每道题只要他有提到可以写个 Recursion 版本,我都会停下来写个 Recursion 版本再跑测试和听他的讲解,暂时也没有遇到写不出来需要先看讲解的题目。主要我觉得他的课程循序渐进安排得真好。

因为人家的课程有版权,我就没办法写逐题分析,但我会在全部刷完后,写一个学到的新知识点总结。

2022 年 8月31日到9月1日
看完并刷完 Binary Tree 的部分,进度 41%,这两天比较疲劳,平均学习时长大概5小时,这个部分好像有两题我是看了 Approach 才想出来。

2022 年 9月2日休息一天,9月3日学了5小时左右,9月4日周日又休息跟朋友出去玩,现在进度是48%。

2022 年 9月5日和6日分别都是4个半小时,7日1小时,终于完成 Graph 的部分,进度 55%,有几道题我都是看了 Approach 才做出来的。

2022 年 9月7日,今天打算复习一下 3Blue1Brown 的 Linear Algebra

9月7日看完了 3Blue1Brown 的 Linear Algebra 的1-9集,之后8到10号比较忙,慢慢看完了剩下的10到16集。有几集重看了几次,补了一些以前没有完全搞懂的细节。

10号过中秋了,如果真的刚好有朋友在10号刷到这个页面,祝你中秋快乐哈哈!

接下来打算来补一下 Number Theory(数论)的知识,也会继续完成 Structy 余下的部分。

先看了这三个视频,了解了一下 Partial Order, Total Order 和 Well Order。
Introduction to Partial Ordering by Neso Academy
Total Order by Jochumzen
Well Ordered Set by Learn with Sreyas
Archimedean Principle Proof by Wrath of Math (这个没完全看懂,感觉需要一点实分析的背景)

9月17号,Structy 那边把 DP 的部分都做完了,进度百分之 68%。
9月18号,Structy 做完 Stack 补充专题,进度百分之 72%。
9月19号,Structy 做完 Exhaustive Recursion,进度百分之 78%。
这样就算是把 Structy 的 Topics 都做完啦!只剩下一个 Mixed Recall 用来复习前面所有学过的 Topic!

我有用一个 app (叫 Timing) 记录在 Algorithms 上花的时间,上面显示从 8 月 25 开始看 Youtube 上的那个 DP 视频到 9 月 19 号,总耗时62小时8分钟。

9月20和21号,因为一些原因,用下面这三个视频补了一下 Markov Chain。以前学过一点,但都忘得差不多了,两天总耗时3小时46分钟。

MIT OCW Markov Chain I
MIT OCW Markov Chain II
MIT OCW Markov Chain III

Number Theory 和 Bit Hacks

9月22日到10月1日,在看 David Burton 的 Elementary Number Theory,暂时做完了 Problem Set 2.4,前面的除了 Problem Set 1.1 和 1.2,其他的每道题都刷了,总耗时 11个小时23分钟。

学了一点 Bit Hacks:
2s complement by Ben Eater (复习一下 2s complement)
GeeksforGeeks: Python Bitwise Operators
GeeksforGeeks: Bitwise Operators in C/C++(跟 Python 那篇差不多,但是之后一些操作会跟 Python 不同)
GeeksforGeeks: Bitwise Hacks for Competitive Programming
GeeksforGeeks: Bit Tricks for Competitive Programming
GeeksforGeeks: Bits manipulation (Important tactics)

在看这些文章的过程中,我觉得这两个 Youtube 视频也很有帮助:
Bit Hacks from Beginner to Advanced by Creel
Bit Hacks by MIT OCW

(这里从 98 题开始因为之前 Structy 做了 72 题)
#98 Missing number in array (GeeksforGeeks)

这篇文章有助于完全理解 XOR 的技巧:
That XOR Trick by Florian Hartmann

#99 Power of 2 (GeeksforGeeks)
#100 Count total set bits (GeeksforGeeks)
#101 Non Repeating Numbers (GeeksforGeeks) (这个的解法真的帅)
#102 Bit Difference (GeeksforGeeks) (没想到 Hard 蛮快就做出来了,觉得自己进步了不少)

做完了 David Burton 的 Elementary Number Theory 的 Problem Set 2.5。

#103 Find element occuring once when all other are present thrice (GeeksforGeeks)

因为这道题,我重新学了 Boolean Algebra,把这个视频列表的 7 到 20 看了一遍:
Digital Electronics by Neso Academy

因为一些解法有提到有限状态自动机,我又去学了一点 Theory (以前没有学过)。

看了这里的 1 到 9:
Theory of Computation & Automata Theory by Neso Academy