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;
    }
};

【LeetCode】50. Pow(x, n) (3 solutions)

 

解法二:非递归

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

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

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

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

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

class Solution {
public:
    double pow(double x, int n) {
        if(n == 0)
            return 1;
            
        int sign = 1;  
        if(n == INT_MIN)
            return pow(x, n+1) / x;
        else if(n < 0)
        {
            sign *= -1;
            n *= -1;
        }
        
        double ret = 1;
        double mul = x;
        while(n)
        {
            if(n & 1)
                ret *= mul;
            n >>= 1;
            mul *= mul;
        }
        
        if(sign == 1)
            return ret;
        else
            return 1 / ret;
    }
};

【LeetCode】50. Pow(x, n) (3 solutions)

 

解法三:just a joke

class Solution {
public:
    double pow(double x, int n) {
        return std::pow(x,n);
    }
};

【LeetCode】50. Pow(x, n) (3 solutions)

分类:

技术点:

相关文章: