双指针
应用
1.给定一个有序递增数组,在数组中找到满足条件的两个数,使得这两个数的和为某一给定的值。如果有多对数,只输出一对即可。
2.hoare的双向扫描快速划分法。
3.奇偶排序
4.求单链表的中间元素。
关键词:
- array 类型
- 两类元素
- 有一定的有序性
异构指针
一般是针对 array 类型的题目。array 当中有两类元素,他们 之间 或者 各自 有某种顺序。我们维护两个 pointer,每个 pointer 负责一种一类,这样就能在保证顺序的情况下,进行某种操作。
快慢指针
快慢指针一般用于链表。为什么链表的问题,很多都要用到快慢指针呢?因为链表的 idexing 是很弱的,每次只能看到自己的 next(非常“短视”)。通过快慢指针,我们可以“之后”或者“之前”的一些元素,实际上是增加了“视野”。
递归
递归就是有去(递去)有回(归来),如下图所示。“有去”是指:递归问题必须可以分解为若干个规模较小,与原问题形式相同的子问题,这些子问题可以用相同的解题思路来解决,就像上面例子中的钥匙可以打开后面所有门上的锁一样;“有回”是指 : 这些问题的演化过程是一个从大到小,由近及远的过程,并且会有一个明确的终点(临界点),一旦到达了这个临界点,就不用再往更小、更远的地方走下去。最后,从这个临界点开始,原路返回到原点,原问题解决。
三个要素:
明确递归终止条件;
给出递归终止时的处理办法;
提取重复的逻辑,缩小问题规模。
应用场景:
- 问题的定义是按递归定义的(Fibonacci函数,阶乘,…);
- 问题的解法是递归的(有些问题只能使用递归方法来解决,例如,汉诺塔问题,…);
- 数据结构是递归的(链表、树等的操作,包括树的遍历,树的深度,…)。