本题的时间复杂度为o(logn),采用的是快速幂的方法,比如求4^5,如果暴力求解,时间复杂度就是o(n), 4 ^ 5可以拆成 4 ^ 1 * 4 ^ 4,注意1和4的由来,5的二进制表示是101,低位的1对应2的0次方,那么就是1,高位的1对应2的2次方,那么就是4,所以任何一个数的任何次幂都可以拆成这样的形式,因为二进制可以表示任何一个数,所以整个代码就相当于求n的二进制,在程序中,n一直在右移,相当于一直除以2,所以时间复杂度就是o(logn)
class Solution {
public:
double myPow(double x, int n) {
double res = 1;
long long n1 = abs(n);//注意,n为-2^31的时候,-n就是2^31,那么-n就超过了int的范围,须声明为long long
while (n1) {
if (n1 & 1) res = res * x;
n1 >>= 1;
x = x * x;
}
if (n < 0) res = 1 / res;
return res;
}
};