[LeetCode解題攻略] 50. Pow(x, n)

更新於 發佈於 閱讀時間約 4 分鐘

題目描述

實作 pow(x, n),即計算 x 的 n 次方(即 x^n),其中 x 是一個浮點數,而 n 是一個整數。


範例

範例 1

輸入: x = 2.0, n = 10
輸出: 1024.0

範例 2

輸入: x = 2.1, n = 3
輸出: 9.261

範例 3

輸入: x = 2.0, n = -2
輸出: 0.25
解釋: 2^(-2) = 1 / (2^2) = 1/4 = 0.25

限制條件

  • -100.0 < x < 100.0
  • 231 <= n <= 231-1
  • -104 <= xn <= 104

解法一:暴力法

思路:

  • 直接從 1 乘到 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

時間與空間複雜度:

  • 時間複雜度:O(n),如果n很大的話,速度會變得很慢。
  • 空間複雜度:O(1),只用到常數變數。

解法二:遞迴法

思路:

利用指數拆解的技巧:

  • 如果 n 是偶數,則:xn = (xn/2) × (xn/2)
  • 如果 n 是奇數,則:xn = x × xn−1
  • 當 n < 0 時,轉換為:xn=1/x−n

透過這種方式,每次計算時 n 都會減半,因此時間複雜度為 O(log⁡n)


程式碼:

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)

時間與空間複雜度:

  • 時間複雜度:O(log⁡n),每次遞迴都將 n 減半。
  • 空間複雜度:O(log⁡n),遞迴深度最多為 O(log⁡n)。

解法三:迭代法

思路:

遞迴方法雖然時間複雜度是 O(log⁡n),但遞迴會使用額外的棧空間,因此可以用迭代方式來節省空間。

我們可以使用 位運算 來加速:

  • 如果 n 是奇數,則乘上 x,並讓 n 減 1。
  • n 右移一位(相當於 n = n // 2),並讓 x 平方
  • 迴圈直到 n 變為 0。

這樣能夠在 O(log⁡n) 的時間內完成計算


程式碼:

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

時間與空間複雜度:

  • 時間複雜度:O(log⁡n),與遞迴版本相同,每次將 n 減半。
  • 空間複雜度:O(1),因為沒有遞迴的額外空間需求。

結論

  • 如果 n 很小,暴力法仍然可行,但不推薦。
  • 如果 n 很大,最佳解法是 迭代法,因為:
    • 時間複雜度是 O(log⁡n),比暴力法快很多。
    • 空間複雜度是 O(1),比遞迴法更省記憶體。


留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
9會員
154內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/04/04
給定一個非負整數陣列 nums,其中 nums[i] 代表你在索引 i 處最多可以向右跳幾步。 請判斷是否能夠從索引 0 跳到最後一個索引。
2025/04/04
給定一個非負整數陣列 nums,其中 nums[i] 代表你在索引 i 處最多可以向右跳幾步。 請判斷是否能夠從索引 0 跳到最後一個索引。
2025/03/28
給定一個 m x n 的矩陣 matrix,請按照 螺旋順序(spiral order) 返回矩陣中的所有元素。
2025/03/28
給定一個 m x n 的矩陣 matrix,請按照 螺旋順序(spiral order) 返回矩陣中的所有元素。
2025/03/20
這道題是 LeetCode 的經典題之一,要求我們找出 一個子陣列,使其和最大,並返回這個最大和的數值。
2025/03/20
這道題是 LeetCode 的經典題之一,要求我們找出 一個子陣列,使其和最大,並返回這個最大和的數值。
看更多
你可能也想看
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
題目給定一個布林代數的二元樹,要求我們計算最後的結果。 葉子節點都是真假值 非葉子節點都是布林運算子
Thumbnail
題目給定一個布林代數的二元樹,要求我們計算最後的結果。 葉子節點都是真假值 非葉子節點都是布林運算子
Thumbnail
題目敘述 給定一個非零陣列nums,請找出陣列裡面 最大的對偶數 是誰? 如果無解,請返回-1 對偶數定義: 整數k的對偶數是-k 例如: 99 和 -99互為對偶數。
Thumbnail
題目敘述 給定一個非零陣列nums,請找出陣列裡面 最大的對偶數 是誰? 如果無解,請返回-1 對偶數定義: 整數k的對偶數是-k 例如: 99 和 -99互為對偶數。
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目敘述 題目會給定我們一個輸入陣列nums,要求我們掃描美個陣列元素nums[i],計算除了nums[i]以外的陣列元素連乘積。 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4] Output: [24,12,8,6] nums[0] 以
Thumbnail
題目敘述 題目會給定我們一個輸入陣列nums,要求我們掃描美個陣列元素nums[i],計算除了nums[i]以外的陣列元素連乘積。 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4] Output: [24,12,8,6] nums[0] 以
Thumbnail
題目敘述 題目會給兩個陣列nums1和nums2。 題目要求我們從中同步選擇長度為k的子序列,並且最大化子序列的分數, 回傳最高的分數值。 分數的定義: 分數 = (nums1[i0] + nums1[i1] +...+ nums1[ik - 1]) * min(nums2[i0] ,
Thumbnail
題目敘述 題目會給兩個陣列nums1和nums2。 題目要求我們從中同步選擇長度為k的子序列,並且最大化子序列的分數, 回傳最高的分數值。 分數的定義: 分數 = (nums1[i0] + nums1[i1] +...+ nums1[ik - 1]) * min(nums2[i0] ,
Thumbnail
題目 : 69. Sqrt(x)
Thumbnail
題目 : 69. Sqrt(x)
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News