## 1. OJ 基本条件
达尔大佬对刷leetcode和刷笔试题有几个建议：

1. 一般oj是有要求时间的，一般是1秒。后台判题系统都是单核单线程跑，机器性能不会太好。1秒能运行的基本操作个数的量级是10^6-10^7，
个别代码能跑到10^8，但很少见。这种情况下，看数据范围是可以大致了解到这个题目需要什么样子的时间复杂度。
比如说，n<=1000的数据范围，o(n^3)的代码就不要写了，浪费时间而已。写代码之前得先计算自己代码的复杂度，预估自己代码跑的速度，再动手。
2. 基本操作指的是逻辑和加减法，乘法比加减法慢得多，但在大复杂度的前提下，这种复杂度是可以忽略的。比如说，在一个算法o(n^3)中，
代码中一个两层嵌套循环o(n^2)就显得没什么优化意义了。优化代码主要优化算法复杂度，而那些，要不要用位运算代替除法啊，
或者两个一层循环要不要合并成一个一层循环啊，没有意义，不要纠结，同级复杂度，才有优化意义
3. 高级编程语言每个api都有自己的复杂度，在没有了解复杂度之前不建议使用那些api，最好自己实现，比如哈希表啊，堆啊，
什么语言都有实现，熟悉之前还是乖乖自己实现的好
4. 注意精度误差。。。比如开方，如果开方开的是一个整数，结果也是整数，最好写个二分，或者写个牛顿迭代求零点，
不要用内置函数sqrt，求出来是个浮点数，会有误差


## 2. 判断环
- 看到链表中的环就想到快慢指针
- 看到图中的环就想到并查集，wisdompeak大佬说：用union find确实是判断图是否成环的一个很好的手段。但是它更常用在无向图。
对于有向图，用并查集需要非常小心。这里的edge都是有向的，我觉得无脑用并查集会有风险。
我的总结是：union find唯一能用在有向图的地方，就是只有我们试图保证这张图是树的时候。
