50. Pow(x, n)

来源:互联网 发布:域名续费期限 编辑:程序博客网 时间:2024/06/06 05:31

Implement pow(xn).

题目求x的n次方,n可以为正、负、零。

最简单的思路,递归或者循环,把x的n次方化为x*(x的n-1次方),然后依次计算下去直至n为0.

但是这样做显然不是一种高效率的方法,因为需要递归n次,当n比较大时可能出现栈溢出、超时等情况

我们优化一下减少递归次数,当n为偶数时,把x的n次方化为(x*x)的n/2次方,当n为奇数时,把x的n次方化为x*((x*x)的n/2次方),这样一来,次方每次都减少一半,总共需要递归logn次,递归次数大大减少了,下面是代码:

public class Solution {    public double myPow(double x, int n) {        return myPow(x,(long)n);    }    public double myPow(double x, long n){        //重载一个myPow()方法,用以规避当n=Integer.MIN_VALUE时,
                                                    //  n=-n出现溢出的情况
        if(n == 0)            return 1;        if(n < 0){            n = -n;            x = 1/x;        }        return n%2==0 ? myPow(x*x,n/2) : x*myPow(x*x,n/2);    }   }

原创粉丝点击