LeetCode[Math]----Pow(x, n)

95 篇文章 0 订阅
93 篇文章 0 订阅
本文介绍了如何实现LeetCode上的 Pow(x, n) 题目,通过二分法解决,讨论了如何优化二分法代码,并提出了一种利用位运算的高效方法,将计算次数减少到O(log n)。" 41311423,1151025,Teradata学习:核心能力、索引与SQL交易处理,"['数据库管理', 'Teradata', 'SQL', '数据存储', '数据库理论']
摘要由CSDN通过智能技术生成

Pow(x, n)

Implement pow(xn).


分析:

实现pow函数,注意,这里的n是int类型,比较简单,使用二分法。


代码:

class Solution(object):
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        if n < 0:
            return 1 / self.cal(x, -n)
        return self.cal(x, n)

    def cal(self, x, n):
        if n == 0:
            return 1
        if n == 1:
            return x
        t = self.cal(x, n/2)
        if n % 2 == 0:
            return t*t
        return t*t*x


----------------------------------------------------------------------------------------------------------------

2016-04-28补充:修改一下上面的代码,同时补充一种更为高效的利用位运算的代码。

对于二分法,之前写的代码可以进行优化。

代码为:

class Solution(object):
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        if n == 0:
            return 1
        if n == -1:
            return 1 / x
        return self.myPow(x*x, n/2)*([1, x][n%2])


对于位运算方式,注意到如果要求A的n次幂,比如当n为11时,其11的二进制表示为1011,则A^n = A^(2^3) * A^(2^1) * A^(2^0) = A^8 * A^2 * A,这样我们只需要计算3次即可得到所需要的A的n次幂了。

我们可以利用上述2进制和幂的关系进行求解。(更多关于快速幂运算的知识请自行百度谷歌)

代码为:

class Solution(object):
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        absn = abs(n)
        res = 1
        while absn:
            if absn & 1:
                res *= x
            x *= x
            absn >>= 1
        return res if n > 0 else 1.0 / res


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值