说明:
- -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
从而可得xn = x1b1x2b2……x2m-1bm
从而 xn 的求解变成了获取b1、b2……bm的值,以及计算x1、x2……x2m-1的值
在实现上,n&1 可以得到 n 二进制最后一位的值,计算后通过移位操作 n >>1 右移一位删去最后一位。
x 的幂则通过循环赋值 x = x2 计算,将线性复杂度化为对数复杂度。
简单的说就是将 n 不断二分,每次循环计算 x*x2 而不是 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; } }