一、前言
每天五分鐘,看懂一道簡單、中等難度的算法題,儘可能將複雜的題講清楚。
瘋狂學習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、能夠考慮所有特殊測試數據。
四、暴力解法
解法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個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。求出子問題的解,就可得到原問題的解。即一種分目標完成程序算法,簡單問題可用二分法完成。
更多參考:分治算法詳解