leetcode 50. Pow(x, n)(x的n次方)

在这里插入图片描述
求x的n次方。

思路:

第一个想到的思路是x和它自己乘n次,
但是这样做会面临一些问题:
如果是简单的n很小的情况还好,但是可以看到n的取值横跨整个整数范围,
如果n非常大,一次一次乘x效率低是其一。

一般来说,如果n为负数,会先取abs(n), 乘x直至n=0后,再用1.0/res.
但是你会发现,如果n = -231, 那么abs(n)会溢出(正数范围到-231-1),得到错误的结果。

所以要换个思路。

在网上看到这种方法不错,时间复杂度为O(nlogn),
把xn等价于x2 * xn/2, 这样不断地把n分解为n/2.
相当于递归调用myPow函数,myPow(x, n) = x2 * myPow(x, n/2).

但是你会问如果n不能被2整除怎么办,
那就把余数单独拿出来再乘一遍:xn = x2 * xn/2 * xn%2

如果n为负数呢,
在递归到n=1或者-1的时候再做处理,因为n为负数时也只需要最后做一次1.0/res.
n=1时,就是x本身,n=-1时,就是1.0/x

public double myPow(double x, int n) {
    
    
    if(n == 0 || x == 1) return 1.0;
    int nMod2 = n % 2;
    double a = 1.0;

   if(nMod2 == 1) {
    
    
        a = x;
    } else if(nMod2 == -1){
    
    
        a = 1.0/x;
    }
    return myPow(x*x, n/2)*a;
}

猜你喜欢

转载自blog.csdn.net/level_code/article/details/131900120