【无标题】

1.思路:使用快速幂,将x的a次方的值数a转换为2进制的形式,即x ^ a = x^ (1 * b1) * x^ (2 * b2) * x^ (4 * b3) * …,bi为0或者1
2.代码:
class Solution {
    public double myPow(double x, int n) {
        if(n == 0) return 1;
        double res = 1.0;
        //当n为负数时,例如2的-3,做法是将2变为小数,-3变为正3,由于int的范围是[-2147483648,2147483647],将其变为正数可能越界,所以使用long
        long b = n;
        if(b < 0){
            //由于x为小数,则不会像 1 / 2 = 0
            x = 1 / x;
            b = -b;
        }
        //使用快速幂,要求x的a次方,可以将a转为二进制的形式: a = 2 * b1 + 2 * b2 ... + 2 * bi + c
        //x的a次方 = x ^ (2 * b1) * x ^ (2 * b2) *... * x ^ c
        //例如求6的11次方,就等于 6 ^ (2进制1011) = 6 ^ (2 * 3) * 6 ^ (2 * 1) * 6 ^ (2 * 0)
        //可以理解:6的11次方等于6的8次方 * 6的2次方 * 6的1次方,在循环的时候,res和x都循环赋值。
        while(b > 0){
            //利用与运算,逐次求b的二进制最后一位,如果为1,则循环赋值x = x ^ 2
            if((b & 1) != 0)res *= x;
            x *= x;
            //右移一位,相当于去掉最后一位
            b = b >> 1;
        }
        return res;
    }
}
3.复杂度分析:时间o(log2(n)),因为快速幂是二分思想,时间复杂度等同二分。空间为o(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值