> 有点恐惧动态规划,而且我理解算法本身就很慢,归并排序都看了很久,就是递归没学明白啊
动态规划可以简单约等于递归,你没明白动态规划是因为你没明白递归。
写动态规划步骤:
1. 忘记其他的所有东西,状态转移方程之类的,只练写低效递归,保证逻辑正确
2. 用字典缓存参数对应的函数结果,这个叫 memoization,如果用 Python 就是直接加个 @
lru_cache 就行了
3. 用写好的函数打印前几个结果,找一下规律,然后把内外翻过来,从自顶向下翻译成自底向上就是 DP 了
专心练第一步就行,熟悉了之后后面两部手到擒来。DP 和 memoization 是方向相反效果类似的,先写 memoization 要比 DP 容易很多。
> 归并排序都看了很久
不光是递归没明白,如果你只熟悉递归看明白归并其实还是很困难,算法有很多套路的。
归并是二叉树后序遍历,因为是后合并,所以就是后序遍历,你把二叉树后序遍历练几遍就会发现代码形状是一样的。
反过来快排就是二叉树前序遍历,因为是先交换,交换完后面就没事了,所以是前序。
你感觉很多人看起来理解力爆炸,其实只是他们练得多,而不是聪明。你看一段代码要从 0% 理解到 100%,他看一段代码识别一个模板就等于看完 80%了,再把 20%关键点看一下就懂了。