美文网首页
LeetCode 第 50 题:Pow(x, n)

LeetCode 第 50 题:Pow(x, n)

作者: 放开那个BUG | 来源:发表于2023-03-23 11:30 被阅读0次

1、前言

图片.png

2、思路

有递归和迭代两种方法。
递归就是将原来的数切成一半,切的时候考虑奇数还是偶数。奇数往下切还需要乘 x,偶数不需要,但是为了统一也可以乘。然后考虑递归出口,分为3种情况:n == 0 则说明 n 为 1,直接返回1即可;n == 1 则说明 n 为2或3,直接返回 x;n 为-1 则说明 n 为 -2或-3,直接返回 1/x。
主体部分分为 half 与 rest。

迭代就是将指数变成2进制,比如53,则为5(0011),只有2进制为1才有贡献,即 5^2 * 5^1,则可以迭代推出。

3、代码

递归:

class Solution {
    public double myPow(double x, int n) {
        long N = n;
        return N >= 0 ? myRec(x, N) : 1.0 / myRec(x, -N);
    }

    public double myRec(double x, long n){
        if(n == 0){
            return 1.0;
        }

        double half = myRec(x, n / 2);
        return n % 2 == 0 ? half * half : x * half * half;
    }
}

迭代:

class Solution {
    public double myPow(double x, int n) {
        long N = n;
        return N >= 0 ? myMulti(x, N) : 1.0 / myMulti(x, -N);
    }

    public double myMulti(double x, long n){
        double res = 1.0;
        while(n > 0){
            // 最低位是1,则说明有贡献
            if((n & 1) == 1){
                res *= x;
            }
            // 每一位不断累乘
            x *= x;
            // n 不断往右移动
            n = n >> 1;
        }

        return res;
    }
}

相关文章

网友评论

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

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