java 50. Pow(x,n)(#。java

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 50. Pow(x,n)(#。java相关的知识,希望对你有一定的参考价值。

/* This is a simple solution based on divide and conquer */


 public class Solution {
        public double pow(double x, int m) {
            double temp=x;
            if(m==0)
            return 1;
            temp=pow(x,m/2);
            if(m%2==0)
            return temp*temp;
            else 
            {
            if(m > 0)
                return x*temp*temp;
            else
                return (temp*temp)/x;
            }

    }
/*
按照定义做的O(n)肯定是TLE的。
利用这个信息:x2n = (xn)2
有个注意点,当n为负是,直接取反是不可行的。
由于int的表示范围是[-231, 231-1],当n为INT_MIN时,取反会溢出。
因此需要对n==INT_MIN单独考虑。
另外,除以2可以用右移1位来实现。

思路1:利用整数n的二进制表达
性质:(x^y)^z = x^(y*z)
例如:(5^3)^2 = 5^3 * 5^3 = 5^(3*2)

10: 二进制(1010)b = (2^3)*1 + (2^2)*0 + (2^1)*1 + (2^0)*0
3^10 = 3^[(2^3)*1] * 3^[(2^2)*0] * 3^[(2^1)*1] * 3^[(2^0)*0] 
res = 1
res = res^2 * 3^1 = 3^(1)b
res = res^2 * 3^0 = 3^2 = 3^(10)b
res = res^2 * 3^1 = 3^5 = 3^(101)b
res = res^2 * 3^0 = 3^10 = 3^(1010)b
需要特殊处理 n<0的情况。

思路2:分治递归

递归公式为:x^n = x^(n/2) * x^(n/2) * x^(n%2)
*/
//Solution1
class Solution {
public:
    double pow(double x, int n) {
        bool negPow = n<0 ? true : false;
        n = abs(n);
        double res = 1;
        for(int i=31; i>=0; i--) {
            res = res*res;
            if(n & (1<<i))
                res = res*x;
        }
        if(negPow) res = 1/res;
        return res;
    }
};

//Solution2
class Solution {
public:
    double pow(double x, int n) {
        if(n>=0)
            return powPositive(x,n);
        else
            return 1/powPositive(x,-n);
    }

    double powPositive(double x, int n) {
        if(n==0) return 1; // base case
        double res = powPositive(x, n/2);
        res *= res;
        if(n%2) res *= x;
        return res;
    }
};
public class Solution {
    public double myPow(double x, int n) {
        if (n == 0) {
            return 1;
        }
        if (n < 0) {
            //n *= -1; 2.00000 ^ (-2147483648) output 0.00000
            x = 1 / x;
        }
        return n % 2 == 0 ? myPow(x * x, Math.abs(n / 2)) : x * myPow(x * x, Math.abs(n / 2));
    }
}

以上是关于java 50. Pow(x,n)(#。java的主要内容,如果未能解决你的问题,请参考以下文章

java 50. Pow(x,n)(#。java

java 50. Pow(x,n)(#。java

java 50. Pow(x,n)(#。java

java 50. Pow(x,n)(#。java

[LeetCode] 50. Pow(x, n) Java

LeetCode 50. Pow(x, n)(快速幂,Java)