以下2个leetcode puzzle Pow(x,n)的解决方案有什么区别

时间:2016-06-28 04:20:22

标签: java return-value pow

我正在研究名为Pow(x,n)(https://leetcode.com/problems/powx-n/)的LeetCode问题50号。它要求我返回x的n次幂。以下是我最初的分而治之的解决方案。

    public class Solution {
public double myPow(double x, int n) {
    if(n == 1) {return x;}
    if(n == 0) {return 1;}
    if(x == 0) {return 0;}
    if(x == 1) {return 1;}


    if(n>0)
    {
        if(n%2 == 1)
        {
            return (myPow(x,n/2)*myPow(x,n/2)*x);
        }
        else
        {
            return (myPow(x,n/2)*myPow(x,n/2));
        }
    }
    else if((n<0)&&(n>Integer.MIN_VALUE))
    {
        return (1/myPow(x,-n));
    }
    else return (1/(x*myPow(x,-n-1)));


  }
}

问题在于,对于非常大的n,此解决方案具有超出时间限制的问题。但是,如果我将代码更改为以下内容,则会解决超出时间限制的问题:

public class Solution {
public double myPow(double x, int n) {
    if(n == 1) {return x;}
    if(n == 0) {return 1;}
    if(x == 0) {return 0;}
    if(x == 1) {return 1;}


    if(n>0)
    {
        if(n%2 == 1)
        {
            double sub = myPow(x,n/2);
            return sub*sub*x;
        }
        else
        {
            double sub = myPow(x,n/2);
            return sub*sub;            }
    }
    else if((n<0)&&(n>Integer.MIN_VALUE))
    {
        return (1/myPow(x,-n));
    }
    else return (1/(x*myPow(x,-n-1)));


}
}

为什么分配子结果的值可以解决超出时间限制的问题?有什么区别?

1 个答案:

答案 0 :(得分:0)

因为JVM不知道你的两个myPow(x,n / 2)会做同样的事情,所以它会计算两次。将其分配给局部变量会消除此恶意,因此您的执行时间大致 halfed 减少到1/2 ^ n时间。不再超时了。