FPGA之UART簡單通訊篇
阿新 • • 發佈:2020-09-22
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
說明:
-100.0 <x< 100.0
n是 32 位有符號整數,其數值範圍是[−231,231− 1] 。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/powx-n
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題解:
首先觀察輸入輸出:
當n為正數時,輸出myPow(x, n)
當n為負數時,輸出1/myPow(x, -n)
所以需要額外的一個函式來處理這種情況。
題本的資料量大小:
-100.0 < x < 100.0
n是32位的有符號數,如果使用暴力迴圈的方法,則一定會超時,程式碼如下:
class Solution: def myPow(self, x: float, n: int) -> float: def my_pow(x, n): res = 1.0 for i in range(n): res = res * xreturn res return my_pow(x, n) if n >= 0 else 1.0 / my_pow(x, -n)
因此,我們可以採用分治的思想,進行遞迴,不斷得減小問題規模。
求xn,採用分治,將問題規模縮小一半,我們可以求出y = x[n//2]:
- 當x為偶數時,xn = y * y
- 當n為奇數時,xn = y * y * x
- 當規模減小到0時,我們得到x0 = 1
程式碼如下:
class Solution: def myPow(self, x: float, n: int) -> float: defmy_pow(x, N): if N == 0: return 1.0 else: y = my_pow(x, N // 2) return y * y if N % 2 == 0 else y * y * x return my_pow(x, n) if n >= 0 else 1 / my_pow(x, -n)
時間複雜度:O(logn),遞迴的層數
空間複雜度:O(logn),遞迴的層數(遞迴時呼叫的額外的棧空間)