美文网首页
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