Leetcode 050. Pow(x, n)

https://leetcode.cn/problems/powx-n/description/

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。

 

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:

输入:x = 2.10000, n = 3
输出:9.26100
示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
 

提示:

-100.0 < x < 100.0
-2^31 <= n <= 2^31-1
n 是一个整数
要么 x 不为零,要么 n > 0 。
-104 <= xn <= 104

解答

考虑幂指数过大,不可能暴力逐个乘下去。
使用快速幂手段来解决该题
我们求解2^7  是 2*2*2*2*2*2*2 
注意到7的二进制是111,对应的 2^7 也可以表示成 2^1 * 2^2* 2^3 =  2*4*16
那么暴力的逐个乘时间O(n) 可以优化成时间O(logn)

代码如下

class Solution {
public:
    double myPow(double x, int n) {
        double ret = 1.0;
     
        while(n>0){
            if(n&1){
                ret *=x;
            }
            n>>=1;
            x*=x;
        }

        return ret;
    }
};

注意版本1 并不能通过 n 有负数。
我们添加负数标记,计算完成后 结果result变成 1/result;

class Solution {
public:
    double myPow(double x, int n) {
        double ret = 1.0;
        int flag =0;
        if(n<0) {flag =1;n=-n;}
        while(n>0){
            if(n&1){
                ret *=x;
            }
            n>>=1;
            x*=x;
        }
        if(flag==1) ret = 1/ret;
        return ret;
    }
};

版本2很接近胜利了,但是n的范围在计算+-n的时候已经超过int的最大值了。
使用longlong 解决,所以得出最后的正确版本

class Solution {
public:
    double myPow(double x, int m) {
        double ret = 1.0;
        int flag =0;
        long long n =m;
        if(n<0) {flag =1;n=-n;}
        while(n>0){
            if(n&1){
                ret *=x;
            }
            n>>=1;
            x*=x;
        }
        if(flag==1) ret = 1/ret;
        return ret;
    }
};

我的视频题解空间

posted on 2024-01-17 11:25  itdef  阅读(9)  评论(0编辑  收藏  举报

导航