【算法】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)

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