實作 pow(x, n)
,即計算 x 的 n 次方(即 x^n),其中 x
是一個浮點數,而 n
是一個整數。
輸入: x = 2.0, n = 10範例 2
輸出: 1024.0
輸入: x = 2.1, n = 3
輸出: 9.261
範例 3
輸入: x = 2.0, n = -2
輸出: 0.25
解釋: 2^(-2) = 1 / (2^2) = 1/4 = 0.25
n
,若 n
為負數則計算 1 / (x^n)。class Solution:
def myPow(self, x: float, n: int) -> float:
if n < 0:
x = 1 / x
n = -n
result = 1
for _ in range(n):
result *= x
return result
利用指數拆解的技巧:
透過這種方式,每次計算時 n
都會減半,因此時間複雜度為 O(logn)。
class Solution:
def myPow(self, x: float, n: int) -> float:
if n == 0:
return 1
if n < 0:
return 1 / self.myPow(x, -n)
if n % 2 == 0:
half = self.myPow(x, n // 2)
return half * half
else:
return x * self.myPow(x, n - 1)
n
減半。遞迴方法雖然時間複雜度是 O(logn),但遞迴會使用額外的棧空間,因此可以用迭代方式來節省空間。
我們可以使用 位運算 來加速:
n
是奇數,則乘上 x
,並讓 n
減 1。n
右移一位(相當於 n = n // 2
),並讓 x
平方。n
變為 0。這樣能夠在 O(logn) 的時間內完成計算。
class Solution:
def myPow(self, x: float, n: int) -> float:
if n < 0:
x = 1 / x
n = -n
result = 1
while n:
if n % 2 == 1: # 若 n 是奇數
result *= x
x *= x # x^2
n //= 2 # n 除以 2
return result
n
減半。n
很小,暴力法仍然可行,但不推薦。n
很大,最佳解法是 迭代法,因為: