【算法】leetcode 50. Pow(x, n)(分治思想、位运算实现快速幂)

问题来源

50. Pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

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

大佬解析


代码


"""
需求:
    实现 pow(x, n) ,即计算 x 的 n 次幂函数。
思路1:x**n
思路2:暴力迭代(运行超时)
思路3:超过最大深度
    二分法+递归
    pow(x, n) = pow(x, n/2)**2 or pow(x, (n-1)/2)*pow(x, (n+1)/2)
思路4: 
    分治思想+位运算
"""


class Solution:
    def myPow(self, x: float, n: int) -> float:
        """分治思想+位运算"""
        res = 1
        if n < 0:  # 处理n为负数的情形
            x, n = 1 / x, -n

        while n:
            if n & 1:  # 当前位置为1,则说明有对应幂指数
                res *= x
            x *= x  # 底数空转
            n >>= 1  # 右移一位
        return res

    def myPow1(self, x: float, n: int) -> float:
        return x ** n

    def myPow2(self, x: float, n: int) -> float:
        # 暴力迭代
        if n == 0:
            return 1

        res = 1
        for i in range(n if n > 0 else -n):
            res *= x

        return res if n > 0 else 1 / res

    def myPow3(self, x: float, n: int) -> float:
        """递归,超过最大深度"""

        def pow(x, n):
            if n == 1:
                return x
            elif n == 0:
                return 1

            if n % 2 == 0:
                cur_v = pow(x, n / 2)
                return cur_v * cur_v
            else:
                return pow(x, (n - 1) / 2) * pow(x, (n + 1) / 2)

        if n >= 0:
            return pow(x, n)
        else:
            return 1 / pow(x, n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章