leetcode50- Pow(x, n)- medium

本文介绍了一种使用快速幂运算计算x^n的方法,包括递归和迭代两种方式,并提供了详细的Java代码实现。通过将问题分解为更小的问题,该算法可以在O(log n)的时间复杂度内完成计算。

Implement pow(xn).


Example 1:

Input: 2.00000, 10
Output: 1024.00000

 

Example 2:

Input: 2.10000, 3
Output: 9.26100

 

1.二分法递归。 把pow(x,n)拆解为pow(x,n/2) 的平方,这样就能做到logN了。

2.折半。while循环每次计数要乘的部分n折半,数据处理就是自己乘自己,然后小心n是奇数的时候多乘一个x

细节:1.n为奇数的时候要多乘一个x。2.n是负数的时候先作为正数处理,最后返回1/result 3.小心输入n = -21...8最小数的情况,反转会溢出,可以转换为1/x * pow(x, -21..7)

 

简洁实现

public class Solution {
    /*
     * @param x: the base number
     * @param n: the power number
     * @return: the result
     */
    public double myPow(double x, int n) {
        // write your code here
        if (n == 0) {
            return 1.0;
        } else if (n < 0) {
            return 1 / myPow(x, -n - 1) / x;
        } else if (n % 2 == 0) {
            return myPow(x * x, n / 2);
        } else {
            return x * myPow(x, n - 1);
        }
    }
}

 

 

class Solution {
    public double myPow(double x, int n) {
        
        if (n == 0) {
            return 1;
        }
        if (n == Integer.MIN_VALUE) {
            return 1 / x * myPow(x, n + 1);
        }
        
        boolean isNegative = false;
        if (n < 0) {
            n = -n;
            isNegative = true;
        }

        double result = myPow(x, n / 2);
        result = result * result;
        if (n % 2 == 1) {
            result = result * x;
        }
        
        if (isNegative) {
            return 1 / result;
        } else {
            return result;
        }
    }
}

 

2.折半法

class Solution {
    public double myPow(double x, int n) {
        
        if (n == 0) {
            return 1;
        }
        if (n == Integer.MIN_VALUE) {
            return 1 / x * myPow(x, n + 1);
        }
        
        boolean isNegative = false;
        if (n < 0) {
            n = -n;
            isNegative = true;
        }

        double result = myPow(x, n / 2);
        result = result * result;
        if (n % 2 == 1) {
            result = result * x;
        }
        
        if (isNegative) {
            return 1 / result;
        } else {
            return result;
        }
    }
}

 

 

 

 

转载于:https://www.cnblogs.com/jasminemzy/p/7814953.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值