1. 程式人生 > 實用技巧 >FPGA之UART簡單通訊篇

FPGA之UART簡單通訊篇

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 * x
            
            
return 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:

        def
my_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),遞迴的層數(遞迴時呼叫的額外的棧空間)