首页 > 代码库 > 【LeetCode】Pow(x, n) (2 solutions)

【LeetCode】Pow(x, n) (2 solutions)

Pow(x, n)

Implement pow(xn).

 

按照定义做的O(n)肯定是TLE的。

利用这个信息:x2n = (xn)2

有个主意点,当n为负是,直接取反是不可行的。

由于int的表示范围是[2-31, 231-1],当n为INT_MIN时,取反会溢出。

因此需要对n==INT_MIN单独考虑。

另外,除以2可以用右移1位来实现。

 

解法一:递归

class Solution {public:    double pow(double x, int n) {        if(n < 0)        {            if(n == INT_MIN)    //-INT_MIN will cause overflow                return pow(x, n+1)/x;            else            {                x = 1/x;                n = -n;            }        }        return Helper(x, n);    }    double Helper(double x, int n)    {//n > 0        if(n == 0)            return 1;        double partRes = Helper(x, n>>1);        if(n%2 == 1)            return partRes*partRes*x;        else            return partRes*partRes;    }};

 

解法二:非递归

对于n的二进制表示,考虑每一位的0/1。

举例n==5,二进制表示为101

右数第一位为1,需要乘以x

右数第二位为0,不需要乘以x2

右数第三位为1,需要乘以x4

class Solution {public:    double pow(double x, int n) {        if(n < 0)        {            if(n == INT_MIN)    //-INT_MIN will cause overflow                return pow(x, n+1)/x;            else            {                x = 1/x;                n = -n;            }        }        return Helper(x, n);    }    double Helper(double x, int n)    {//n > 0        if(n == 0)            return 1;        double Res = 1;        double cur = x;        while(n)        {            if(n%2 == 1)                Res *= cur;            cur *= cur;            n >>= 1;        }        return Res;    }};

【LeetCode】Pow(x, n) (2 solutions)