其他分享
首页 > 其他分享> > 剑指offer(12)--浮点数的整数次方

剑指offer(12)--浮点数的整数次方

作者:互联网

浮点数的整数次方

在这里插入图片描述

1.暴力算法:

这种算法效率不高

class Solution {
public:
         double Power(double base, int exponent) {
             if(exponent==0) return 1;
             if(base==0) return 0;
             double ans=1.0;
             if(exponent>0){
                 while(exponent>0){
                     ans*=base;
                     exponent--;
                 }
                 return ans;
             }else{
                 exponent=-exponent;
                 while(exponent>0){
                     ans*=base;
                     exponent--;
                 }
                 ans=1.0/ans;//注意这里除的时候要用1.0
                 return ans;
             }
         }
};

2.递归快速幂算法

假设我们求图片说明 ,如果我们知道图片说明 ,那么图片说明 ,所以图片说明但是还有个小问题,如果n是偶数,那么上述没问题。如果n是奇数,图片说明 , 比如图片说明

class Solution {
public:
    double q_power(double b, int n) {
        if (n == 0) return 1.0;
        double ret = q_power(b, n/2);
        if (n&1) { // 奇数
            return ret * ret * b;
        }
        else {
            return ret * ret;
        }
    }
    double Power(double b, int n) {
        if (n < 0) {
            b = 1 / b;
            n = -n;
        }
        return q_power(b, n);
    }
};

时间复杂度:O(logn),每次规模减少一半
空间复杂度:O(logn),递归栈,因为要记住logn个变量

3.非递归快速幂算法

在这里插入图片描述

class Solution {
public:

    double Power(double b, int n) {
        if (n < 0) {
            b = 1 / b;
            n = -n;
        }
        double x = b; // 记录x^0, x^1, x^2 ...
        double ret = 1.0;
        while (n) {
            if (n&1) {
                ret *= x; // 二进制位数是1的,乘进答案。
            }
            x *= x;
            n >>= 1;
        }
        return ret;
    }
};

上述方法相当于遍历n的二进制位,是1就乘进结果
时间复杂度:O(logn),因为n的二进制位个数为logn
空间复杂度:O(1)

标签:12,return,exponent,offer,double,浮点数,ret,ans,logn
来源: https://blog.csdn.net/m0_51851827/article/details/116008805