[Python][Leetcode] 練習題目 Two Sum

更新 發佈閱讀 5 分鐘

1. Two Sum

Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

You can return the answer in any order.

Example 1:

Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].

Example 2:

Input: nums = [3,2,4], target = 6
Output: [1,2]

Example 3:

Input: nums = [3,3], target = 6
Output: [0,1]

Constraints:

  • 2 <= nums.length <= 104-109 <= nums[i] <= 109-109 <= target <= 109Only one valid answer exists.

Follow-up: Can you come up with an algorithm that is less than O(n2) time complexity?

📝 題目說明

給定一個整數陣列 nums 和一個整數 target,請你從陣列中找出「兩個數」相加剛好等於 target,並回傳它們的「索引」。

⚠️ 限制:

  • 每個輸入只有 一組正確答案
  • 不能使用同一元素兩次
  • 回傳順序不拘(例如 [1,2][2,1] 都行)

🧠 解題思路

解法 1:暴力法(Brute Force)

雙層迴圈,把所有組合檢查一次。

時間複雜度:O(n²)

→ n 最大到 10⁴,這方法能解但效率不高。

程式碼:

def twoSum(nums, target):
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] == nums[j] == target / 2 and i != j:
return [i, j]
if nums[i] + nums[j] == target:
return [i, j]

解法 2:哈希表(Hash Map)——先存再找

思路:

建一個字典(map),將每個數字與索引記錄起來, 再檢查 target - nums[i] 是否在 map 中。

時間複雜度:O(n)

空間複雜度:O(n)

程式碼:

def twoSum(nums, target):
    hash_dit = {}
    for i,num in enumerate(nums):
        diff = target - num
        if diff in hash_dit:
            return hash_dit[diff] , i # 剛好加起來是 target
        hash_dit[num] = i #找不到就先存起來
    print('不在此列表')

🧠 哈希表的核心概念

🔹 Key → Value 直接定位

一般列表(list)是靠「位置」找資料,例如 nums[3]。

但字典(hash table)是靠「key」找資料,例如 price["apple"]。

哈希表存取方式:

table[key] = value   # 存
value = table[key] # 取

時間複雜度:

  • 查詢:O(1)
  • 新增:O(1)
  • 刪除:O(1)

非常快。


🧪 測試

nums = [2,7,11,15,17,20,50,90]

target = 110

結果索引(5,7) 驗算nums[5] + nums[7] = 20 + 90 =110 剛好為我們target值

raw-image


raw-image



留言
avatar-img
螃蟹_crab的沙龍
157會員
309內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
你可能也想看
Thumbnail
話說身為短線交易者,每天要作的事情就是從盤勢觀察、到籌碼流向,再到經過多維度資料數據交叉比對,盤中盯著分K、江波圖和五檔報價,算計著每一分K線的轉折,雖能換來即時驗證判斷的快感與成就,但長期下來,卻也衍生眼睛與肩頸卻成了抹不去的職業病。
Thumbnail
話說身為短線交易者,每天要作的事情就是從盤勢觀察、到籌碼流向,再到經過多維度資料數據交叉比對,盤中盯著分K、江波圖和五檔報價,算計著每一分K線的轉折,雖能換來即時驗證判斷的快感與成就,但長期下來,卻也衍生眼睛與肩頸卻成了抹不去的職業病。
Thumbnail
這篇文章探討LeetCode第28題:在字串中查找子字串的第一次出現索引。文章說明瞭解題思路,並使用Python的字串切片方法(slicing)有效率地解決問題,包含範例、程式碼及效能考量。
Thumbnail
這篇文章探討LeetCode第28題:在字串中查找子字串的第一次出現索引。文章說明瞭解題思路,並使用Python的字串切片方法(slicing)有效率地解決問題,包含範例、程式碼及效能考量。
Thumbnail
Leetcode 28 解題思路與程式碼範例。文章詳細解釋瞭如何使用迴圈比較字串,找出目標字串在主字串中的第一次出現位置。也提到了使用 slicing strings 方法可以提升效率。
Thumbnail
Leetcode 28 解題思路與程式碼範例。文章詳細解釋瞭如何使用迴圈比較字串,找出目標字串在主字串中的第一次出現位置。也提到了使用 slicing strings 方法可以提升效率。
Thumbnail
對於剛學習Python的初學者,本文建議從Codewars開始,因為該平臺的題目難度比較適合新手,循序漸進,讓初學者能更快上手。在具備基本能力後,可轉向LeetCode進行更高難度的資料結構與演算法的練習,以提升解題速度和能力。
Thumbnail
對於剛學習Python的初學者,本文建議從Codewars開始,因為該平臺的題目難度比較適合新手,循序漸進,讓初學者能更快上手。在具備基本能力後,可轉向LeetCode進行更高難度的資料結構與演算法的練習,以提升解題速度和能力。
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
題目敘述 給定一個非零陣列nums,請找出陣列裡面 最大的對偶數 是誰? 如果無解,請返回-1 對偶數定義: 整數k的對偶數是-k 例如: 99 和 -99互為對偶數。
Thumbnail
題目敘述 給定一個非零陣列nums,請找出陣列裡面 最大的對偶數 是誰? 如果無解,請返回-1 對偶數定義: 整數k的對偶數是-k 例如: 99 和 -99互為對偶數。
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]
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News