leetcode 50. Pow(x, n) java题解

题目

https://leetcode-cn.com/problems/powx-n/

代码

// 暴力计算然后超时了,难以言喻

于是我们采用快速幂:要求x的2n次方,可以先求出x的n次方,再进行平方。(因为x的2n=x的n乘以x的n)
如果要求x=2*n+1次方,可以先求出x的n次方,再进行平方,再乘以一个x。

x负数次方,我们转化为x倒数的正数次方。 int的范围是 [-2的31次方 , 2的31次方-1]。当求 -2的31次方 时,他的倒数(正数)超出了范围,所以用long表示。

class Solution {
    public double myPow(double x, int n) {
        long nn=n;
        if(nn==0)    return 1.0;
        if(nn<0){
            return quick(1.0/x,-nn);
        }
        else
            return quick(x,nn);
    }
    public double quick(double x,long nn){
        if(nn==0)   return 1.0;//递归终止条件
        double y=quick(x,nn/2);
        if(nn%2==0){
            return y*y;
        }
        else{
            return y*y*x;
        }
    }
}

复杂度

时间复杂度:O(logn),即为递归的层数。
空间复杂度:O(logn),即为递归的层数。这是由于递归的函数调用会使用栈空间。

你可能感兴趣的:(LeetCode,java,leetcode,算法,快速幂)