【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
留言分享你的想法!
avatar-img
dizzydog的沙龍
1會員
5內容數
親愛的訪客您好!我是 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
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 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)。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News