leetcode力扣每日一题50. Pow(x, n)

题目描述
实现 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)
而且也容易理解,这道题还有很多解法,希望大家不要拘束于一种解法,加油

你可能感兴趣的:(leetcode,c++,算法,数据结构,leetcode)