码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-12-13 13:26:21      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   sp   strong   on   

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

bubuko.com,布布扣

 

解法二:非递归

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

bubuko.com,布布扣

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

标签:style   blog   http   io   ar   color   sp   strong   on   

原文地址:http://www.cnblogs.com/ganganloveu/p/4161167.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!