zoukankan      html  css  js  c++  java
  • 【LeetCode】50. Pow(x, n) (3 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)
                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;
        }
    };

    解法三:just a joke

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

  • 相关阅读:
    老了老了呜呜呜呜
    我们的焦点在哪里
    visual studio 2010
    饥饿游戏2 影评
    两个极端
    关于怀旧
    进程 线程 碎角料
    拥塞控制
    [zz] 几种类间关系:继承、实现、依赖、关联、聚合、组合及UML实现图
    Markdown 的使用
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4161167.html
Copyright © 2011-2022 走看看