LeetCode_Pow_x_n

Implement pow(xn).

题目很简单,就是实现x的n次方运算:

首先要考虑到各种输入情况:

1)x=0 返回0直接退出

2) n=0 返回1直接推出

3)n<0 需要先求x的abs(n)次方,再取倒数

4)n=0,直接求解即可

另外,如果直接进行n次乘法,肯定超时想都不要想,

最初的想法是,对于任何一个数都可以用1+2+2^2+2^3+.......+2^n组成(不用证明了吧,大家都是学计算机的)

所以保存每个x^1,x^2,...,x^n,空间复杂读O(logn)然后对指数n进行拆分,进而进行相乘操作得到结果,以减少乘法执行的次数,当然这里我还没有考虑到最终结果溢出的情况,写完初始的代码后竟然出现MLE,仔细一分析原来并不需要保存中间结果,空间复杂度可以减少到O(1)

代码如下:

class Solution {
public:
    double pow(double x, int n) {
        if (x==0)
        {
            return 0;
        }
        if(n==0)
        {
            return 1;
        }
        
        double result=1.0;
        double p=x;
        //make sure expoment>0
        int expoment=abs(n);
        int st=1;
        //keep the middle result
      /*  vector <double> powRel;
        powRel.push_back(p);
        while (st<=expoment)
        {
            st=st<<1;
            powRel.push_back(p);
        }*/
        while (expoment>0)
        {
            if (expoment&1)
            {
                result*=p;
            }
            p=p*p;
            expoment=expoment>>1;
        }
        if (n<0)
        {
            return (1.0/result);
        }
        return result;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值