剑指 Offer 16. 数值的整数次方

说明:

  • -100.0 < x < 100.0
  • n 是 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1] 。

 

思路:快速幂

原理:

  xn暴力解法是循环乘x,时间复杂度O(n),但这是线性复杂度的,会超时。

  快速幂的原理则是将幂指数 n 进行分割,从而将其变为对数复杂度的计算。

下面从二进制角度对其进行分析:

  对于十进制整数 n,设其二进制表示为bm……b2b1,则有

  n = 20*b1+21*b2+……+2m-1*bm

从而可得x= x1b1x2b2……x2m-1bm

从而 x的求解变成了获取b1、b2……bm的值以及计算x1、x2……x2m-1的值

  在实现上,n&1 可以得到 n 二进制最后一位的值,计算后通过移位操作 n >>1 右移一位删去最后一位。

  x 的幂则通过循环赋值 x = x计算,将线性复杂度化为对数复杂度。

简单的说就是将 n 不断二分,每次循环计算 x*x而不是 x*x ,从而降低复杂度。

时间复杂度O(log2n)

代码如下:

class Solution {
    public double myPow(double x, int n) {
        if(x == 0)
            return 0;
        long b = n;
        double res = 1.0;
        if(b < 0) {//x^b==(1/x)^(-b)
            x = 1 / x;
            b = -b;
        }
        while(b > 0) {
            if((b & 1) == 1)//二进制后尾部是否为1
                res *= x;
            x *= x;
            b >>= 1;//去掉最后一位
        }
        return res;
    }
}
posted @ 2021-02-22 14:27  zjcfrancis  阅读(59)  评论(0编辑  收藏  举报