思路
快速幂。一个数的幂次可以转成二进制,从最右侧开始,遇到1就乘到结果里。基数x一直在做平方的运算。原理就是任何一个数都可以拆成1,2,4,8,…的和的形式。需要注意边界:当n小于0的时候,先把n转成-(n+1)【防止MIN_INT直接取相反数导致溢出】,然后在result开始的时候多乘一个x即可。
有递归和非递归两种实现方式,代码在下面都贴出来了
复杂度
时间复杂度O(logn)
空间复杂度O(1)
代码
非递归
public class Solution {
/**
* @param x: the base number
* @param n: the power number
* @return: the result
*/
public double myPow(double x, int n) {
// write your code here
boolean isNegative = false;
if (n < 0) {
isNegative = true;
x = 1 / x;
n = -(n + 1); // n == MIN_VALUE
}
double ans = 1, t = x;
while (n > 0) {
if (n % 2 == 1) {
ans *= t;
}
t *= t;
n /= 2;
}
if (isNegative) {
ans *= x;
}
return ans;
}
}
递归
public class Solution {
/**
* @param x: the base number
* @param n: the power number
* @return: the result
*/
public double myPow(double x, int n) {
// write your code here
if (n == 0) {
return 1;
}
double ans = myPow(x, n / 2);
if (n % 2 == 0) {
return ans * ans;
}
return n > 0 ? ans * ans * x : ans * ans * (1 / x);
}
}