Leetcode刷题笔记——50. Pow(x, n)【快速幂算法】

题目

在这里插入图片描述

思路

在这题中,n可能很大(指数爆炸),如果就简单采用for循环计算量太大,由于计算量大而时间耗费长。
因此需要降低n,以减少计算量,最常用的算法即快速幂算法。

所谓快速幂,其核心思想是计算2^9时,可以这样计算:

1、计算2*2*2*2*2*2*2*2*22、计算2*4*4*4*43、计算2*16*164、计算2*256

这样做有两个好处,一是不需要乘8次,降低时间复杂度,二是存在很多冗余计算,2x2时只需要计算一次,剩余的乘法都是2x2,即此时已经变成了2x(4)^4,只需要计算一次2x2即可。

快速幂模板

class Solution {
public:
    double quickPow(double x, int n) {
        double res = 1.0;
        int p = n;
        if(x==1.0) return 1.0;	% 特例,降低计算量
        while(p){
            if(p&1){	% 若p为奇数,取出一个x暂存在res中,p就是偶数了
                res = res * x;
            }
            x = x*x; % p为偶数时,幂每平方一次,指数除以2
            p = p/2;
        }
        % 任何比1大的数除2除到后面都是1,也就是一定会进奇数的if中,此时更新res即可。
        if(n>0){
            return res;
        }else{
            return 1/res;	% n为负数时
        }
    }
};

代码

class Solution {
public:
    double myPow(double x, int n) {
        double res = 1.0;
        long long p = n;
        if(x==1.0) return 1.0;
        while(p){
            if(p&1){
                res = res * x;
            }
            x = x*x;
            p = p/2;
        }
        if(n>0){
            return res;
        }else{
            return 1/res;
        }
    }
};

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值