递归
在我看来递归就是利用本身的程序调用栈来实现的。
比如f(n) = f(n-1) + 1
这个递归 实际上在计算机执行的时候是
f(0)
...
f(n-1)
f(n)
这也是递归和算法的基础。
当然我们也可通过手工栈来实现这个效果。
比如
中左右
root
root.left
root.right
中右左
root
root.right
root.left
左中右
root.left.left
root.left.right
root.left
root
avl高度计算
root.left.high
root.right.high
root.high
DP
DP实际上就是
//边界条件
//loop
//f(n) = f(n-x)
//return f(n)
一维数组还是二维数组
实际上没区别,一般来讲,一位数组的f(n)即为我们要求的值,如斐波那契数列。
多维,无非就是f(i,j)我们去递归i或者j,然后矩阵里的值即为我们最后的结果f(i,j)比如凑数问题。i为次数,j为目标值。
正反
一般来讲看逻辑,比如博弈问题,最后一个人入手方便就是倒叙。i=n;i>0;i--
回溯
我思考了半天什么是回溯,实际上就是从根出发的一棵树而已。
每个节点有个条件公式f() bool
不满足则砍掉。
最后求所有子叶节点罢了。
分治
典型的分治就是快速排序,说白了,快速排序就这么想:
小的左边,大的右边,值放中间。
小的左边,大的右边,值放中间。
小的左边,大的右边,值放中间。
小的左边,大的右边,值放中间。
1372864
小的左边,大的右边,值放中间。
(132)4(786)
小的左边,大的右边,值放中间。
((1)2(3)) 4 (786)
小的左边,大的右边,值放中间。
((1)2(3)) 4 (6(78))
小的左边,大的右边,值放中间。
((1)2(3)) 4 (6(7(8)))
常见替换逻辑
求最大,求最小,±*/mod, +n >< =,不同速度指针下等于