力扣50.Pow(x,n) (java快速幂解法)

Problem: 50. Pow(x, n)

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

当直接用循环解决时,若幂的次数过于大则会严重增加运算时间,为解决该问题而可以采取快速幂算法,可以大大提高运算速度。

对于快速幂应知道:

n为奇数时:$a^n = a \cdot a^{(n - 1)/2} \cdot a^{(n-1)/2}
$
n为偶数时: a n = a n / 2 ⋅ a n / 2 a^n = a ^{n/2} \cdot a^{n/2} an=an/2an/2

但是当n为负数时,我们容易想到将其转换为$\frac{1}{{x^n}}
来求取(即将 n 转换成了整数),但是此时我们应该注意若当 来求取(即将n转换成了整数),但是此时我们应该注意若当 来求取(即将n转换成了整数),但是此时我们应该注意若当n 取 − 31 时,会产生越界(题目中 取-31时,会产生越界(题目中 31时,会产生越界(题目中n \in [-2^{-31}, 2^{31} - 1]
) , 所以我们应当进行一个 ∗ 降幂处理 ∗ 将 ),所以我们应当进行一个*降幂处理*将 ,所以我们应当进行一个降幂处理\frac{1}{{xn}}$准换为$\frac{1}{x{n-1} \cdot {x}}$

解题方法

1.递归实现快速幂函数(退出条件:n == 0 return 1;取幂的一半;分奇数与偶数分别处理)
2.当$n \geq 0
时直接调用快速幂函数;当 时直接调用快速幂函数;当 时直接调用快速幂函数;当n < 0
时我们实现 时我们实现 时我们实现\frac{1}{x^{n-1} \cdot {x}}$进行降幂处理,以防整数的溢出。

复杂度

  • 时间复杂度:

O ( l o g n ) O(logn) O(logn)

  • 空间复杂度:

O ( l o g n ) O(logn) O(logn)

Code


class Solution {
    //快速幂
    //Time Complexity: O(logn)
    //Space Complexity: O(logn)
    public double myPow(double x, int n) {
        if (n >= 0) {
            return binaryExponentiation(x,n);
        } else {
            return 1 / (binaryExponentiation(x, -1*(n + 1)) * x);//-1*(n + 1)*x 防止n的越界
        }
    }

    //用于求取快速幂的递归函数
    public double binaryExponentiation(double x, int n) {
        //递归退出条件
        //n为0时退出(0次为1)
        if (n == 0) return 1;
        //每次去幂的一般
        double halfPower = binaryExponentiation(x, n/2);
        //奇数次幂时:a^n = a * a ^ (n - 1)/2 * a ^ (n-1)/2
        if (n % 2 != 0) {
            return halfPower * halfPower * x;
        } else {偶数次幂时:a^n = a ^ n/2 * a ^ n/2
            return halfPower * halfPower;
        }
    }
}

你可能感兴趣的:(leetcode,java)