什么是分治:

分治会将大问题拆解成小问题,拆解到最小问题之后,开始不断合并结果,递归是分治实现的一种形式或者是分治实现的一部分,分治包括三分部分,分解、计算、合并。分治的场景很多,例如快速排序,归并排序。

[leetcode] 50. Pow(x, n)_排序算法


分治伪代码模版:

function divide_conquer(problem, param1, param2, ...){
if(problem === null){
// return result
}

//分割问题
subproblem = split_problem(problem, data)

//计算子问题
subResult1 = divide_conquer(subproblem[0], p1, ...)
subResult2 = divide_conquer(subproblem[1], p1, ...)
subResult3 = divide_conquer(subproblem[2], p1, ...)
...

result = process_resule(subResult1, subResult2, subResult3,...)
}

计算n!​n! = 1 * 2 * 3... * n​

function factorial(n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}

factorial(6);
6 * factorial(5);
6 * 5 * factorial(4);
//...
6 * 5 * 4 * 3 * 2 * factorial(1);
6 * 5 * 4 * 3 * 2 * 1;
6 * 5 * 4 * 3 * 2;
//...
6 * 120;
720;

斐波那契数列, F(n)=F(n-1)+F(n+2)

function fib(n) {
if (n === 0 || n === 1) {
return n;
}
return fib(n - 1) + fib(n - 2);
}

[leetcode] 50. Pow(x, n)_算法_02


思路:

当n是偶数的时候,对n进行分治,拆解为x*x的n/2的次方,当n为奇数的时候拆分成​​x * myPow(x,n-1)​​,注意当n是负数或者是0的特殊情况

复杂度分析:
时间复杂度:O(logn), n是进行二进制拆分的时间复杂度。
空间复杂度:O(logn), n为递归深度

var myPow = function (x, n) {
if (n === 0) return 1 // n=0直接返回1
if (n < 0) { //n<0时 x的n次方等于1除以x的-n次方分
return 1 / myPow(x, -n)
}
if (n % 2) { //n是奇数时 x的n次方 = x*x的n-1次方
return x * myPow(x, n - 1)
}
return myPow(x * x, n / 2) //n是偶数,使用分治,一分为二,等于x*x的n/2次方
}




参考:
​​​添加链接描述​