[LeetCode解題攻略] 1. Two Sum

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

在 LeetCode 上,Two Sum 這道題目主要考察如何高效地處理數組和數據查找問題,是面試中常見的問題之一。今天我們將詳細解說這道題目,並提供幾種解題方法。

題目描述

給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的索引。你可以假設每種輸入只會對應一個答案,並且你不能重複使用相同的元素。

範例:

輸入:nums = [2, 7, 11, 15], target = 9
輸出:[0, 1]
解釋:因為 nums[0] + nums[1] == 9,所以返回 [0, 1]


解題思路

這道題目的核心是如何在一個數組中找到兩個數字,使它們的和等於 target。常見的解法有以下幾種:暴力解法、使用雜湊表的解法。


1. 暴力解法

最直接的解法就是遍歷數組的每一個元素,並對每個元素再遍歷一次其他元素,來檢查它們是否滿足相加等於 target 的條件。這樣的解法時間複雜度是 O(n^2),對於小型數組可以使用,但如果數組很大,效率會較低。

程式碼:

class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]

時間複雜度:O(n^2)

空間複雜度:O(1)

這種方法非常簡單,但當 nums 長度較大時,可能會導致效能問題。


2. 使用雜湊表的解法

為了提高效率,我們可以使用雜湊表來記錄已經遍歷過的數字。當我們遍歷每一個數字時,計算出需要的另一個數字,並檢查這個數字是否已經在雜湊表中。如果存在,則說明這兩個數字加起來等於 target,我們可以立即返回它們的索引。

這種方法只需要遍歷一次數組,因此時間複雜度可以降低到 O(n)。

程式碼:

class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
num_map = {}
for i, num in enumerate(nums):
complement = target - num
if complement in num_map:
return [num_map[complement], i]
num_map[num] = i

時間複雜度:O(n)

空間複雜度:O(n)

解法解析:

  1. 使用雜湊表 num_map 來存儲每個數字及其對應的索引。
  2. 在遍歷 nums 的過程中,每次計算出當前數字的補數 complement(即 target - num)。
  3. 如果補數已經存在於雜湊表中,則返回補數的索引和當前數字的索引。
  4. 如果補數不存在,將當前數字和它的索引存入雜湊表,繼續遍歷。

這樣的方式大大減少了運算時間,因為查找哈希表中的元素是 O(1) 的操作。


解法總結

  1. 暴力解法:兩重迴圈遍歷所有組合,簡單直觀但效率低,適用於小型數組。
  2. 雜湊表解法:用雜湊表記錄元素,通過查找補數來快速解決問題,適合處理大型數組,時間複雜度僅 O(n)。



結論

Two Sum 是一個經典的面試題,能夠考察你對數組遍歷和查找的基本能力。掌握這道題目後,進一步理解如何有效地使用資料結構(如雜湊表)來解決問題,將對其他類似的問題大有幫助。

這道題目不僅測試了程式設計的基礎功底,也是理解資料結構如何在解題中發揮作用的重要一步。希望透過這篇解題教學,能夠幫助你更好地理解 LeetCode Two Sum 的解法,並靈活應用於其他問題中。

留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
7會員
135內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
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
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
題目敘述 題目會給定一個整數陣列nums,要求我們找出最大的兩個整數a, b,返回(a-1) * (b-1)的乘積。 詳細的題目可在這裡看到 測試範例 Example 1: Input: nums = [3,4,5,2] Output: 12
Thumbnail
題目敘述 題目會給定一個整數陣列nums,要求我們找出最大的兩個整數a, b,返回(a-1) * (b-1)的乘積。 詳細的題目可在這裡看到 測試範例 Example 1: Input: nums = [3,4,5,2] Output: 12
Thumbnail
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
Thumbnail
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
Thumbnail
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
Thumbnail
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
Thumbnail
題目會給定我們一個陣列,並且定義了一種三角形合併的操作。 當下這一排相鄰的兩項相加,對mod 10取餘數,會成為下一排的對應項,一直反覆操作,直到剩下一個元素為止。 要求我們返回最後一層的答案。 測試範例: Example 1: Input: nums = [1,2,
Thumbnail
題目會給定我們一個陣列,並且定義了一種三角形合併的操作。 當下這一排相鄰的兩項相加,對mod 10取餘數,會成為下一排的對應項,一直反覆操作,直到剩下一個元素為止。 要求我們返回最後一層的答案。 測試範例: Example 1: Input: nums = [1,2,
Thumbnail
題目會給定一個陣列,每個數字都恰好出現兩次,只有一個數字是例外。 要求我們找出那個落單也就是例外的數字。
Thumbnail
題目會給定一個陣列,每個數字都恰好出現兩次,只有一個數字是例外。 要求我們找出那個落單也就是例外的數字。
Thumbnail
題目:建立一個函數,該函數返回給定最小 4 個正整數的數組的兩個最低正數的總和。不會傳入浮點數或非正整數。例如,當一個數組像 [19, 5, 42, 2, 77], 輸出應該是 7。 [10, 343445353, 3453445, 3453545353453] 應該回來 3453
Thumbnail
題目:建立一個函數,該函數返回給定最小 4 個正整數的數組的兩個最低正數的總和。不會傳入浮點數或非正整數。例如,當一個數組像 [19, 5, 42, 2, 77], 輸出應該是 7。 [10, 343445353, 3453445, 3453545353453] 應該回來 3453
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News