分治策略
基本思想:将一个难以解决的规模大的问题,分解成一些规模较小的相同问题。
大规模-------->小规模
一定要把问题规模降低到1,或者0时给出具体的求解方案。
递归:分治策略与递归像孪生兄弟,经常应用于算法设计中。
循环与递归:任何单一性的循环可以改为递归,任何单一性的递归也都可以改为循环。
下面我们看几个例子:
1.求1-n的阶乘
若要算1-n的阶乘需要知道1到(n-1)的值 * n
若要算出x的值,需要算1到(n-2)的阶乘乘(n-2)
最终依次将问题的规模降低。为此我们给出两种方案来解决:
①:循环解决
②递归解决(不断缩减问题的规模):
2.求第n位斐波那契数列
斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
①循环解决(时间复杂度为O(n))
②递归解决(时间复杂度为O(2^n))
//如何改进斐波那契数列,使它的时间复杂度和循环的时间复杂度逼近
3.二分查找
适用场景:
1.有序
2.顺序表(向量)
①循环解决
优化一:防止数据超出整型范围:left+right过大时防止出现超过int范围
优化二:如果出现该数组:12 12 12 12 12 23 34 45 56 56 56 56 56 67 78 89 90 100,我们想找到最左端的12,上述方法可能存在越界问题,最左端的12可能会越界
②递归解决