美文网首页
50. Pow(x, n)

50. Pow(x, n)

作者: Abeants | 来源:发表于2022-03-04 22:34 被阅读0次

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn )。

示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:
输入:x = 2.10000, n = 3
输出:9.26100

示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路及方法

这里

求解x的n次幂的时候,我们可以用快速幂算法求解,
例如x77,我们可以可以抽象为:x77 = x64 ✖ x8 ✖ x4 ✖ x1
77的二进制表示为:

         1       0     0     1     1     0     1
        x^64   x^32   x^16  x^8   x^4   x^2   x^1

所以我们仅需要将n次幂数二进制的非零位对应的权重相乘即可。提供两种算法,一种是递归求解,一种是迭代,迭代的好处就是只应用常数的空间,空间效率是O(1)。

public class Solution {

    /**
     * @description: 快速幂加递归解法
     * @author: Abean
     * @date: 2022/7/14 12:12
     * @param: [x, n]
     * @return: double
     **/
    public double myPow(double x, int n) {
        long y = n;
        return y < 0 ? getPow(1 / x, -y) : getPow(x, y);
    }

    public double getPow(double x, long n) {
        if (n == 0) return 1.0d;
        double res = 1;
        while (n > 0) {
            if ((n & 1) == 1) res *= x;
            x *= x;
            n >>= 1;
        }

        return res;
    }

    /**
     * @description: 快速幂加迭代解法
     * @author: Abean
     * @date: 2022/7/14 12:13
     * @param: [x, n]
     * @return: double
     **/
    public double pow(double x, int n) {
        if (x == 0) return 0;
        if (n == 0) return 1;
        // 防止溢出
        long y = n;
        // 若y<0,即求1/x的y次幂
        if (y < 0) {
            x = 1 / x;
            y = -y;
        }

        double res = 1, weight = x;
        while (y > 0) {
            // 若当前二进制位为1,结果乘以权值
            if ((y & 1) == 1) res *= weight;
            weight *= weight;
            // 移位
            y >>= 1;
        }

        return res;
    }
}

结果如下:

递归 迭代

相关文章

网友评论

      本文标题:50. Pow(x, n)

      本文链接:https://www.haomeiwen.com/subject/yifvrrtx.html