[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
留言分享你的想法!
給定一個字串陣列 strs,請將字母相同但排列順序不同的單字(即異位詞,Anagrams)分組。可以以任意順序返回結果。
給定一個 n × n 的 2D 矩陣 matrix,將其順時針旋轉 90 度(原地 旋轉,不使用額外的矩陣)。
給定一個可包含重複數字的整數數組 nums,返回所有不重複的排列。
給定一個不含重複數字的整數陣列 nums,返回所有可能的排列。
給定一個非負整數陣列 nums,其中每個元素代表你在該位置最多可以跳躍的步數,目標是從陣列的第一個位置跳到最後一個位置。請找出你所需要的最小跳躍次數。
給定一個輸入字串 s 和一個Pattern p,要求實現一個能夠支援字元* 和 ?的Wildcard Pattern Matching的函式。
給定一個字串陣列 strs,請將字母相同但排列順序不同的單字(即異位詞,Anagrams)分組。可以以任意順序返回結果。
給定一個 n × n 的 2D 矩陣 matrix,將其順時針旋轉 90 度(原地 旋轉,不使用額外的矩陣)。
給定一個可包含重複數字的整數數組 nums,返回所有不重複的排列。
給定一個不含重複數字的整數陣列 nums,返回所有可能的排列。
給定一個非負整數陣列 nums,其中每個元素代表你在該位置最多可以跳躍的步數,目標是從陣列的第一個位置跳到最後一個位置。請找出你所需要的最小跳躍次數。
給定一個輸入字串 s 和一個Pattern p,要求實現一個能夠支援字元* 和 ?的Wildcard Pattern Matching的函式。
你可能也想看
Google News 追蹤
Thumbnail
【vocus 精選投資理財/金融類沙龍,輸入 "moneyback" 年訂閱 9 折】 市場動盪時,加碼永遠值得的投資標的——「自己」 川普政府再度拋出關稅震撼彈,全球市場應聲重挫,從散戶到專業投資人,都急著找尋買進殺出的訊號,就是現在,輪到知識進場!把握時機讓自己升級,別放過反彈的機會!
Thumbnail
春夏必備的超透氣洞洞鞋! Q彈厚底可以無痛增高 走起來也更舒適~ 還能一秒變換涼鞋、拖鞋! 鞋身用造型和紋路去展現質感 讓素色鞋面更百搭! 隨意簡單的搭配就很好看 就連休閒洋裝打起來也無違和! 這個夏天一定要擁有一雙洞洞鞋吧✌︎(°͈ꆚ°͈)ว 📣Crocs洞洞鞋限時下殺只要
Thumbnail
momo店+ S999純銀四葉草項鍊,精緻細膩,代表愛情、希望、信念與幸運,是送給自己或別人的完美禮物。限時下殺299元起,超取免運!
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
題目給定一個布林代數的二元樹,要求我們計算最後的結果。 葉子節點都是真假值 非葉子節點都是布林運算子
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
題目敘述 題目會給兩個陣列nums1和nums2。 題目要求我們從中同步選擇長度為k的子序列,並且最大化子序列的分數, 回傳最高的分數值。 分數的定義: 分數 = (nums1[i0] + nums1[i1] +...+ nums1[ik - 1]) * min(nums2[i0] ,
Thumbnail
題目會給定兩個參數,一個是底數x,一個是次方n。要求我們計算出x^n。 要求實作myPow(self, x: float, n: int) -> float 函數的內部邏輯。 也就是說,不可以呼叫程式語言內建計算指數的library
分享一道數學證明題 題目是將1~10的正整數分成兩組,分別為A組、B組 其中A組數字由小到大排列,B組數字則是由大到小排列,試求兩兩相減的絕對值總和
Thumbnail
【vocus 精選投資理財/金融類沙龍,輸入 "moneyback" 年訂閱 9 折】 市場動盪時,加碼永遠值得的投資標的——「自己」 川普政府再度拋出關稅震撼彈,全球市場應聲重挫,從散戶到專業投資人,都急著找尋買進殺出的訊號,就是現在,輪到知識進場!把握時機讓自己升級,別放過反彈的機會!
Thumbnail
春夏必備的超透氣洞洞鞋! Q彈厚底可以無痛增高 走起來也更舒適~ 還能一秒變換涼鞋、拖鞋! 鞋身用造型和紋路去展現質感 讓素色鞋面更百搭! 隨意簡單的搭配就很好看 就連休閒洋裝打起來也無違和! 這個夏天一定要擁有一雙洞洞鞋吧✌︎(°͈ꆚ°͈)ว 📣Crocs洞洞鞋限時下殺只要
Thumbnail
momo店+ S999純銀四葉草項鍊,精緻細膩,代表愛情、希望、信念與幸運,是送給自己或別人的完美禮物。限時下殺299元起,超取免運!
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
題目給定一個布林代數的二元樹,要求我們計算最後的結果。 葉子節點都是真假值 非葉子節點都是布林運算子
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
題目敘述 題目會給兩個陣列nums1和nums2。 題目要求我們從中同步選擇長度為k的子序列,並且最大化子序列的分數, 回傳最高的分數值。 分數的定義: 分數 = (nums1[i0] + nums1[i1] +...+ nums1[ik - 1]) * min(nums2[i0] ,
Thumbnail
題目會給定兩個參數,一個是底數x,一個是次方n。要求我們計算出x^n。 要求實作myPow(self, x: float, n: int) -> float 函數的內部邏輯。 也就是說,不可以呼叫程式語言內建計算指數的library
分享一道數學證明題 題目是將1~10的正整數分成兩組,分別為A組、B組 其中A組數字由小到大排列,B組數字則是由大到小排列,試求兩兩相減的絕對值總和