这个题目说实话刚开始感觉棘手,后来如果用心想发现没那么难,当然暴力法在此我们就不多接赘述了。
1. 递归法
就是将问题分解成小问题,也叫快速幂法,代码如下。一定要注意的就是对于n<0
时的处理情况,将其变为n>0
的情况进行处理。
class Solution {
public double myPow(double x, int n) {
if(n == 0) return 1; //快速返回
if (n < 0) { //对于n<0的情况,都变为n>0的情况
x = 1 / x;
n = -n;
}
return fastPow(x, n);
}
//递归求值
private double fastPow(double x, int n) {
if (n == 1) //当指数为1时,直接返回x,这样就没有考虑指数为0的情况
return x;
double half = fastPow(x, n/2); //求一半
return n%2==0 ? half*half : half*half*x; //按照指数的奇偶返回对应的值
}
}
当然我的这个解法有溢出情况存在,就是对于n=0的情况可能处理的不太好,但也是只有4个测试用例没有通过。因为我任务当n==1时返回更容易理解些。
2. 迭代法
有递归法就有迭代法,代码如下,参考leetcode官方题解。
class Solution {
public double myPow(double x, int n) {
long N = n;
if (N < 0) {
x = 1 / x;
N = -N;
}
double ans = 1;
double current_product = x;
for (long i = N; i > 0; i /= 2) {
if ((i % 2) == 1) { //如果是奇数,将当前的值乘到ans上,到最后肯定有i%2==1的时候,再将原来乘得的ans乘到当前的值上
ans = ans * current_product;
}
current_product = current_product * current_product;
}
return ans;
}
}