【5分鐘力扣】50. 用python3實現Pow(x,n)冪次運算

一、前言

每天五分鐘,看懂一道簡單、中等難度的算法題,儘可能將複雜的題講清楚。
瘋狂學習python中,2020-05-31更新

在這裏插入圖片描述

二、題目

實現 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

說明:

-100.0 < x < 100.0
n 是 32 位有符號整數,其數值範圍是 [−231, 231 − 1] 。

**來源:**力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/powx-n
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

三、題目考點

本題粗看,平平無奇,一個 return x** n 就能解決問題。但是從面試官角度考慮,它的出題點應該是:

1、優化程序運行速度,實現log(n)時間複雜度算法

2、能夠考慮所有特殊測試數據。

參考博客:時間複雜度 O(log n) 意味着什麼?

四、暴力解法

解法4.1思路

Xn :本質上就是 N個X相乘,那麼先處理特殊情況,然後直接循環N次,就能解決問題了?

4.2 代碼實例

class Solution:
    def myPow(self, x: float, n: int) -> float:
        if x == 0 and n < 0:  # 底數爲0,冪爲負數,程序會直接報錯。
            return None
        if n == 0:
            return 1
        # 處理n 爲負數情況    
        if n < 0:
            x = 1 / x
            n = -n
        res = float(1)
        for i in range(n):
            res *= x
        return res
if __name__ == '__main__':
    obj = Solution()
    print(obj.myPow(0, -1))

本解法時間複雜度是O(n),提交力扣出現 超出時間限制情況

在這裏插入圖片描述

五、分治思想,遞歸解法

5.1 解法思路

如果我們要計算 365 ,可以使用分治思想,將其拆分成 3(32)*2 * 3,依次遞歸一步步分解到最小個體, 分解步驟:

3—32 —34 —316 —332 —364 —364*3 —365

也就是要計算Xn ,可以先遞歸出 y = X(n/2)

  • 如果n爲偶數,那麼 Xn = y2

  • 如果n爲奇數,那麼 Xn = y2 * X

  • 遞歸的邊界n=0,任意數的0次方均爲1

由於每次遞歸都會將算法複雜度減少一半,因此遞歸的層數爲 O(log n),算法可以在很快的時間內得到結果。

5.2 代碼實例

# 分治思想,遞歸解法
class Solution:
    def myPow(self, x: float, n: int) -> float:
        if x == 0 and n < 0:
            return
        def recursion(N):
            if N == 0:
                return 1.0
            y = recursion(N // 2)
            if N % 2 == 0:
                return y * y
            else:
                return y*y*x
        return recursion(n) if n >= 0 else 1/recursion(-n)

if __name__ == '__main__':
    obj = Solution()
    print(obj.myPow(3, 66))
    

在這裏插入圖片描述

六 分治算法思想

分治算法的基本思想是將一個規模爲N的問題分解爲K個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。求出子問題的解,就可得到原問題的解。即一種分目標完成程序算法,簡單問題可用二分法完成。

在這裏插入圖片描述

更多參考:分治算法詳解

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