一晃就研二下了,离毕业也只有短短一年,终于快逃出无线通信的魔爪了,想想就有点小激动啊,由于自己是非CS科班出身,一些CS方面的基础肯定是得在找工作/实习之前夯实的啦,比如数据结构和算法、编程语言、操作系统、数据库等等啦,最最重要的自然就是算法和编程语言了咯。本着独乐乐不如众乐乐的开源精神,我将自己的算法学习笔记公开和小伙伴们讨论,希望高手们不吝赐教。
主要内容为学习算法和刷leetcode/lintcode过程中的笔记,很大程度上参考了九章算法 的代码和讲稿,先行谢过!同时也参考了一些其他教材和优质博客,凡参考过的几乎都给出明确链接,如果不小心忘记了,请不要吝惜你的评论和issue :)
Search this site
进行站内搜索,也可 Google 站内搜索如无特殊说明,本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。欢迎 fork 和传播本文档,但是请注意遵循以上许可协议。
如果你发现本文档有任何可以改进之处,欢迎提交你的改进,具体形式有如下几种。
既然涉及到文档合作,那么最好是能有个像样的文档规范之类的东西方便大家更好的合(jiao)作(ji),目前想到的有如下几点。
把这三块吃透后对付找工作方面的算法应该是绰绰有余了。
使用markdown编写,只使用 gitbook 支持的 markdown 语法。gitbook 底层的 markdown renderer 为改动的 kramdown,并增加了GFM支持, 支持的扩展 markdown 语法算是非常多了,具体特性详见 GitbookIO/kramed
推荐的 markdown 编辑器为 gitbook 自家的 GitbookIO/editor, 支持 Windows/Linux/MAC 三大平台,业界良心!但是实测在Arch Linux下可能会出现占用内存过高的情况... OS X 下目前表现还算良好,编辑界面如下图所示,最左边为章节预览,中间为 markdown 编辑框,右边为实时渲染页面,可选择使用全屏模式。
使用其他如 Mou/Vim/Emacs/Sublime Text也不错,但是在新增Chapter/Section时就比较闹心了,嗯,你也可以新建 Section 后再使用其他编辑器编辑。
对 Gitbook 不熟的建议看看 Gitbook Documentation,有助于了解 http://algorithm.yuanbin.me 网页上的文字及各章节等是如何编辑及渲染的。
章节等文件名全部采用英文,子章节最多到三级,章节编号无需操心,这种琐事交给 Gitbook 去做就好,如果一定要手动调整,修改SUMMARY.md
文件,注意其中的缩进关系,Gitbook就指望这个自动给章节编号了。
举个例子,我现在想新增「动态规划」及其子章节。首先在 Gitbook 顶部菜单栏「Book」中找到「Add Chapter」,填入「Dynamic Programming」。好了,在Gitbook左侧章节栏中就能看到新生成的「10. Dynamic Programming」了,左键击之,Gitbook 就会生成「dynamic_programming」目录及本章的说明文件「dynamic_programming/README.md」。如果想在「10. Dynamic Programming」下新增子章节,右键击之,「Add Section」即可,同上,子章节文件名仍然使用英文名,网页显示的标题可以通过 rename 更改再加入中文。
嗯,以上步骤均可直接新建文件夹及操作SUMMARY.md
文件完成。
其实代码里是用不着写数学公式的,但是偶尔分析算法可能会用着,用过 LaTeX 的都知道她生成的数学公式有多优雅,以至于不用她来写数学公式都有点不舒服...
这个文档里对于较复杂的数学公式建议使用 LaTeX, 因为托管在gitbook上,所以就用了轻量级的katex插件,没有用重量级的 MathJax。行内和行间公式都是 两个$, 区别在于行间公式写到下一行行首,而行内公式不能写在行首(废话...)。katex非常脆弱,对一些高级的 LaTeX 语法不支持,否则无法编译输出到网站和pdf,尽量用简单的 LaTeX 语法或者不用。
Part II为leetcode/lintcode题解,这部分的风格相对容易统一,大致遵循如下风格:
感觉还不错的风格 - raw convert_sorted_list_to_binary_search_tree.md
通过github合作时,添加/修改内容时给出能看懂的commit就好了。暂时就想到这么多,其实没那么多讲究啦,感觉看着清楚就好,其他想到的再补充。:-)
图片统一存放在images
目录下,其他附件存放在docs
目录下。引用图片链接一般可以通过![Caption](../images/xxx.png)
声明。
图片体积太大不利于页面加载,建议先压缩后再放入,如果是png图片可考虑使用 TinyPNG – Compress PNG images while preserving transparency
虽说练习算法偏向于算法本身,但是好的代码风格还是很有必要的。粗略可分为以下几点:
而对于实战算法的过程中,我们可以采取如下策略:
以下整理了一些最近练习算法的网站资源,和大家共享之。
source
处选择 CC150 或者其他来源的题。会根据系统locale选择中文或者英文,可以拿此 OJ 辅助 leetcode 进行练习。本节后三项参考自九章微信分享,谢过。