【leetcode解題日記】1. 兩數之和 (簡單)

更新 發佈閱讀 4 分鐘

值得紀念的leetcode第一題 —— 兩數之和,其不僅考驗對陣列的基本操作,也能夠學會使用資料結構來優化演算法效率。

題目說明

給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,並返回它們的數組下標。

你可以假設每個輸入只會對應一個答案,而且你不能使用兩次相同的元素。

你可以按任意順序返回答案。

解題思路

透過雙層迴圈即可透過遍歷的方式找出答案。然而,此暴力解法的時間複雜度為O(n2)。

var twoSum = function(nums, target) {
for(let i = 0; i < nums.length; i++){
for(let j = i + 1; j < nums.length; j++){
if(nums[i] + nums[j] === target){
return [i, j]
}
}
}
return [] // 沒找到符合條件的結果
};

更快的解法 —— 哈希表

什麼是哈希表?

  • 哈希表(hash table),又稱作雜湊表,其透過建立鍵key 與值 value 之間的映射,來實現高效率的元素查詢。具體地,我們向哈希表中輸入一個鍵 key ,則可以在O(1)時間內獲取對應的值 value 。
  • 邏輯:
    • 使用一個 Map(哈希表)來記錄已經看過的數字和對應的索引。
    • 在每次迴圈時,先計算出「差值」complement = target - nums[i]。
    • 檢查這個差值是否已經存在於哈希表中:如果存在,表示找到了答案。
    • 如果還沒存在,就把目前的數字及其索引記錄到哈希表中。
var twoSum = function(nums, target) {
// 建立一個空的哈希表
const map = new Map();

for(let i = 0; i < nums.length; i++){
const complement = target - nums[i];
// 查找 complement 是否已存在於 map 中
if(map.has(complement)){
      // 找到答案了!
return [map.get(complement), i];
}
// 如果還沒找到符合的組合,就把當前數字 nums[i] 及其索引 i 存進 map 中。
map.set(nums[i], i);
}

return []; // 沒找到符合條件的結果
};
  • 哈希表解法的優點:
    • 只需要遍歷一次陣列,使得時間複雜度降為 O(n)
    • 使用空間換時間,額外使用了一個哈希表來記錄已遍歷過的元素及其索引

總結

透過暴力解法,可以以時間複雜度O(n2)得出答案,而透過哈希表,由於可以根據哈希表記錄先前查詢的結果並進行查找,只需要遍歷一次陣列,使得時間複雜度降為 O(n)。

本題雖然簡單,但蘊含了資料結構與演算法的思維轉變,從暴力枚舉到使用哈希表,體現了空間換時間的設計哲學,非常的beautiful。



留言
avatar-img
dizzydog的沙龍
4會員
10內容數
親愛的訪客您好!我是 dizzydog,一位熱衷於前端技術的工程師。這個部落格是我的數位筆記本,記錄著我在程式開發路上的各種發現、挑戰與突破。我相信「輸出」是最有效的學習方式,透過清晰地表達所學,不僅能加深自己的理解,也能幫助其他走在相同道路上的開發者。 歡迎您在這裡探索以及交流。
dizzydog的沙龍的其他內容
2025/05/09
這篇文章探討 LeetCode 中等難度的題目:反轉字串中的單詞。文章詳細解釋瞭如何在 O(1) 空間複雜度下解決此問題,並逐步說明了移除多餘空格、反轉整個字串以及逐個反轉單詞的過程。此外,文章還提供了一個時間複雜度為 O(n),空間複雜度為 O(n) 的解法作對比。
Thumbnail
2025/05/09
這篇文章探討 LeetCode 中等難度的題目:反轉字串中的單詞。文章詳細解釋瞭如何在 O(1) 空間複雜度下解決此問題,並逐步說明了移除多餘空格、反轉整個字串以及逐個反轉單詞的過程。此外,文章還提供了一個時間複雜度為 O(n),空間複雜度為 O(n) 的解法作對比。
Thumbnail
2025/05/07
本文中說明了如何創建 JavaScript 中的 ArrayWrapper 類別,該類實現了兩個核心功能:通過 valueOf() 方法使實例相加時返回數組元素總和,以及通過 toString() 方法提供格式化字符串表示,其與JavaScript 自動類型轉換機制深度相關。
Thumbnail
2025/05/07
本文中說明了如何創建 JavaScript 中的 ArrayWrapper 類別,該類實現了兩個核心功能:通過 valueOf() 方法使實例相加時返回數組元素總和,以及通過 toString() 方法提供格式化字符串表示,其與JavaScript 自動類型轉換機制深度相關。
Thumbnail
2025/05/06
今天來分享一個中等難度的 LeetCode 題目 —— 加油站問題(Gas Station)。看到這道題的第一直覺是透過窮舉法來測試所有的起點,但也可以透過線性時間解法來優雅的解決這個問題。
Thumbnail
2025/05/06
今天來分享一個中等難度的 LeetCode 題目 —— 加油站問題(Gas Station)。看到這道題的第一直覺是透過窮舉法來測試所有的起點,但也可以透過線性時間解法來優雅的解決這個問題。
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
Thumbnail
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
題目敘述 Combination Sum IV 給定一個輸入陣列nums,和目標值target,從nums裡面挑數字去湊出總和 = target,數字可以重複挑選。 請問有多少排列數可以湊出target? 註: 排列數的意思就是位置不同代表兩種不同的方法數。
Thumbnail
題目敘述 Combination Sum IV 給定一個輸入陣列nums,和目標值target,從nums裡面挑數字去湊出總和 = target,數字可以重複挑選。 請問有多少排列數可以湊出target? 註: 排列數的意思就是位置不同代表兩種不同的方法數。
Thumbnail
題目敘述 Single Number II 給定一個輸入陣列,已知有一個烙單的數字,其他剩餘的數字都恰巧出現三次。 請找出這個烙單的數字。 題目額外提出限制,請使用O(n)線性時間、O(1)常數空間複雜度的演算法。 測試範例 Example 1: Input: nums = [2,2,
Thumbnail
題目敘述 Single Number II 給定一個輸入陣列,已知有一個烙單的數字,其他剩餘的數字都恰巧出現三次。 請找出這個烙單的數字。 題目額外提出限制,請使用O(n)線性時間、O(1)常數空間複雜度的演算法。 測試範例 Example 1: Input: nums = [2,2,
Thumbnail
題目敘述 Single Number III 給定一個輸入陣列,已知有兩個烙單的數字,其他剩餘的數字都恰巧出現兩次。 請找出這兩個烙單的數字。 題目額外提出限制,請使用O(n)線性時間、O(1)常數空間複雜度的演算法。 測試範例 Example 1: Input: nums = [1,
Thumbnail
題目敘述 Single Number III 給定一個輸入陣列,已知有兩個烙單的數字,其他剩餘的數字都恰巧出現兩次。 請找出這兩個烙單的數字。 題目額外提出限制,請使用O(n)線性時間、O(1)常數空間複雜度的演算法。 測試範例 Example 1: Input: nums = [1,
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
題目敘述 輸入給定一個二元的二維矩陣grid 每次可以翻轉一條row,讓每個元素的01反相。 也可以翻轉一條column,讓每個元素的01反相。 可以操作任意多次。 最後把每條row視為一條二進位表達式的數字,並且進行加總,得到最後的分數。 請問分數的最大值是多少? 原本的英文題目敘
Thumbnail
題目敘述 輸入給定一個二元的二維矩陣grid 每次可以翻轉一條row,讓每個元素的01反相。 也可以翻轉一條column,讓每個元素的01反相。 可以操作任意多次。 最後把每條row視為一條二進位表達式的數字,並且進行加總,得到最後的分數。 請問分數的最大值是多少? 原本的英文題目敘
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News