[leetcode] 50. Pow(x, n)
原创
©著作权归作者所有:来自51CTO博客作者533_的原创作品,请联系作者获取转载授权,否则将追究法律责任
什么是分治:
分治会将大问题拆解成小问题,拆解到最小问题之后,开始不断合并结果,递归是分治实现的一种形式或者是分治实现的一部分,分治包括三分部分,分解、计算、合并。分治的场景很多,例如快速排序,归并排序。
分治伪代码模版:
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);
}
思路:
当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次方
}
参考:
添加链接描述