题目描述
实现 pow(x, n) ,即计算 x 的 n 次幂函数
我们先来看一下比较容易理解的递归或循环
以下是递归的例子,是容易理解的,但是空间复杂度和时间复杂度上却很多
我们不难看出
时间复杂度为O(n);
空间复杂度为O(n);
class Solution {
public:
double myPow(double x, int n) {
if(x==1){
return x;
}
if(x==-1){
if(n%2==0) return -x;
else return x;
}
if((x>-100&&x<100)&&(n<2147483647&&n>-2147483648)){
if(n>=1){
if(n==1){
return x;
}
else return x*myPow(x,n-1);
}
else if(n==0) return 1;
else{
if(n==-1){
return 1/x;
}
else return (1/x)*myPow(x,n+1);
}
}
return NULL;
}
};
同样,利用循环时:
时间复杂度也为O(n);
空间复杂度也为O(n);
无法达到O(logN)的复杂度
所以我们需要简化,运用二分递归的方法,简化时间复杂度和空间复杂度;
我们希望的时间复杂度和空间复杂度为O(logN),我们最熟悉的时间复杂度和空间复杂度为O(logN)的算法就是二分查找,所以我们把二分查找的思想用到这里:
比如我们要求x的32次方则通过1,2,4,8,16,32来求x的32次放,那么再比如99的话就可以通过1,2+1,6,12,24,48+1,98+1来求x的99次方,这种不是2的正次方的数我们显然是无法从前往后计算的,所以我们从后往前计算,即如果这个数y可以被2整除为x,那就是y = x × 2;如果不可以,那就是余1,那就是y = x × 2 + 1;这就是二分思想,所以我们来写出代码:
C++代码
class Solution {
public:
double quickMul(double x, long long N) {
if (N == 0) {
return 1.0;
}
double y = quickMul(x, N / 2);
return N % 2 == 0 ? y * y : y * y * x;
}
double myPow(double x, int n) {
long long N = n;
return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
}
};
我们可以看出这种方法
时间复杂度为O(logN)
空间复杂度为O(logN)
而且也容易理解,这道题还有很多解法,希望大家不要拘束于一种解法,加油