12 图解剑指Offer 数值的整数次方 Java题解
题目链接
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
题解:
快速幂原理
1.如果base 等于0,则返回0.
2.如果exponent < 0,让 base = 1 / base 然后 exponent = - exponent。一个数的-2次幂等于 这个数的倒数的2次幂。
3. 利用快速幂算法,设置res = 1.0 ,当exponent>0 且幂数为奇数时,res = exponent,否则 base = base * base,exponent = exponent/2。例: 3的5次幂 result = 399
图解:
代码:
public double Power(double base, int exponent) {
if(base == 0) return 0;
if(exponent < 0) {
base = 1/base;
exponent = - exponent;
}
double res = 1.0;
while(exponent > 0) {
if((exponent & 1) == 1) {
res = res*base;
}
base = base*base;
exponent = exponent >> 1;
}
return res;
}
复杂度
空间复杂度: 空间复杂度为O(1)
最坏时间复杂度: 遍历时间复杂度O(log n)