菜鸟前端刷算法第九天

48 阅读1分钟

题目描述 - Pow(x, n)

实现 pow(xn) ,即计算 x 的整数 n 次幂函数(即,x^n )。

示例:

  • 输入: x = 2.00000, n = 10,输出: 1024.00000
  • 输入: x = 2.10000, n = 3,输出: 9.26100
  • 输入: x = 2.00000, n = -2,输出: 0.25000

思路分析

Pow(x, n),即求输入数字xn次幂。最直接的方案是用循环将num自乘,乘power次,则时间复杂度是O(n),x * power(x, n-1), 这样的解法并不能通过力扣编译,会报错:Maximum call stack size exceeded, 初步猜测是形成了闭包造成堆栈溢出。

再次分析,我们可以利用分治递归思路解决此问题。当n是偶数的时候,对n进行分治,拆解为x*xn/2的次方,当n为奇数的时候拆分成x * myPow(x,n-1),这里需要特别注意的是当n为负数或者是0的特殊情况。

代码实现:

/**
 * @param {number} x
 * @param {number} n
 * @return {number}
 */
var myPow = function(x, n) {
    // 处理 n 为 0 的情况
    if(n===0)return 1
    // 处理 n 为 负数 的情况
    if(n<0){
        return 1 / myPow(x, -n)
    }
    // n 为奇数
    if(n % 2){
        return x * myPow(x, n - 1)
    }
    return myPow(x*x, n/2)
    
};

除了分治递归的方法外, 我们也可以通过迭代实现上述结果:

/**
 * @param {number} x
 * @param {number} n
 * @return {number}
 */
var myPow = function(x, n) {
    if(n===0)return 1
    if(n<0){
        return 1 / myPow(x, -n)
    }
    if(n === 1) return x
    let res = 1
    while(n >=1){
        if(n % 2){
            res = res * x
            n--
        }
        x = x * x
        n = n/2
    }
    return res
};

相对于递归算法,迭代的方法可能不太好理解,具体运行流程如下面例子:

myPow(2,5) 求 2 的 5 次幂
x = 2,n = 5; n % 2 == 1, res = 2 * 1;  => res = 2; n=4
x = 2,n = 4; n % 2 == 0, x = 2 * 2; => x = 4 ; n = n/2 = 2
x = 2, n = 2; n % 2 == 0, x = 4 * 2;  => x = 8 ; n = n/2 = 1
x = 2, n = 1; n % 2 == 1, res = 2 * 8; n-- => res = 16 ; n=0 
x = 2, n = 1; 跳出循环 得到结果