【學習筆記 - DSA】Two Sum, Contains Duplicate

更新 發佈閱讀 5 分鐘

Two Sum


Two Sum 是最經典的「用 Hash Table 將 O(n²) 優化成 O(n)」的入門題,非常適合用來理解 Hashing 的核心價值。


給定一個整數陣列 nums 與一個整數 target,請找出 兩個不同索引的數字,使得它們的和等於 target

  • 每個輸入只會有一組解
  • 同一個元素不能使用兩次
  • 回傳的是原始陣列中的索引

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

解法 1:Brute Force (Array)

最直覺的方式: 依序嘗試所有可能的兩兩組合。

vocus|新世代的創作平台
function twoSum(nums: number[], target: number): number[] {
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 [];
}
vocus|新世代的創作平台

解法 2:Hash Table

利用 Hash Table「快速查找」的特性
一邊遍歷陣列,一邊記錄已看過的數字

核心想法是:

  • 當前數字是 num
  • 我需要的另一個數是 target - num
  • 如果這個數之前出現過,就直接找到答案
vocus|新世代的創作平台
function twoSum(nums: number[], target: number): number[] {
const numIndexMap = new Map<number, number>();
for (let i = 0; i < nums.length; i++) {
const num = nums[i];
const complement = target - num;
if (numIndexMap.has(complement)) {
return [numIndexMap.get(complement)!, i];
}
numIndexMap.set(num, i);
}
return [];
}
vocus|新世代的創作平台

Contains Duplicate

這題可以直觀感受 Set「只保留唯一值」的特性,也是理解 Hash-based 結構最直覺的案例之一。


給定一個整數陣列 nums,請判斷陣列中是否存在 任意一個數字重複出現至少兩次。

  • 如果有重複,回傳 true
  • 否則回傳 false


Input: nums = [1, 2, 3, 1]
Output: true

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


解法 1:Set

  • Set 只會保留「唯一值」
  • 如果 Set 的大小比原陣列小,就代表有重複
vocus|新世代的創作平台
function containsDuplicate(nums: number[]): boolean {
const uniqueElements = new Set(nums);
return uniqueElements.size < nums.length;
}
vocus|新世代的創作平台

解法 2:Sort

如果陣列排序後,有任意兩個相鄰元素相同,就代表存在重複

vocus|新世代的創作平台


注意:此解法會改變原陣列順序,因此實務上需確認是否允許修改輸入資料。

function containsDuplicate(nums: number[]): boolean {
const sortedNums = nums.slice().sort((a, b) => a - b);

for (let i = 0; i < sortedNums.length - 1; i++) {
if (sortedNums[i] === sortedNums[i + 1]) {
return true;
}
}

return false;
}
vocus|新世代的創作平台

小結

  • Hash Table 能用空間換時間,大幅降低查找成本
  • Two Sum 與 Contains Duplicate 用來理解 Hash Table / Set 為什麼重要


留言
avatar-img
樹杷林柳橙誌
1會員
6內容數
記錄生活、思考、心得
樹杷林柳橙誌的其他內容
2025/12/24
什麼是資料結構 資料結構是資料在記憶體中的組織方式,包含資料的集合、彼此之間的關係,以及可以對這些資料進行的操作。 資料結構很像「收納」。 記憶體就像收納空間,資料是被收納的物品,而資料結構就是收納的方式。 在有限的空間下,不同的收納方式,會影響我們找資料的速度、使用的空間大小,以及新增或移除
Thumbnail
2025/12/24
什麼是資料結構 資料結構是資料在記憶體中的組織方式,包含資料的集合、彼此之間的關係,以及可以對這些資料進行的操作。 資料結構很像「收納」。 記憶體就像收納空間,資料是被收納的物品,而資料結構就是收納的方式。 在有限的空間下,不同的收納方式,會影響我們找資料的速度、使用的空間大小,以及新增或移除
Thumbnail
2025/12/17
圖像理解,對我來說比較自然 如果是電腦科學本科背景,資料結構與演算法大多是必修基礎;但對像我這樣,從生科系轉職成前端工程師的人來說,一開始就算沒有把這一塊補齊,好像也能開始寫程式、完成工作。只是工作一段時間後,我越來越明顯感覺到:很多實際遇到的問題,其實都和資料結構與演算法有關。
2025/12/17
圖像理解,對我來說比較自然 如果是電腦科學本科背景,資料結構與演算法大多是必修基礎;但對像我這樣,從生科系轉職成前端工程師的人來說,一開始就算沒有把這一塊補齊,好像也能開始寫程式、完成工作。只是工作一段時間後,我越來越明顯感覺到:很多實際遇到的問題,其實都和資料結構與演算法有關。
2025/11/30
最近在社群平台上看到好多人發文,內容大概就是我使用 xxx 模型,輕鬆開發出了一個可以用的程式,甚至有很多不是工程師本業的人都做到了。我想說真的那麼神嗎?結果我已經花了兩週的時間還是沒辦法開發出我覺得正常的系統。這讓我思考問題到底出在哪? 在我深入研究這個問題的根源時,我接觸到了 《規格驅動全自動
Thumbnail
2025/11/30
最近在社群平台上看到好多人發文,內容大概就是我使用 xxx 模型,輕鬆開發出了一個可以用的程式,甚至有很多不是工程師本業的人都做到了。我想說真的那麼神嗎?結果我已經花了兩週的時間還是沒辦法開發出我覺得正常的系統。這讓我思考問題到底出在哪? 在我深入研究這個問題的根源時,我接觸到了 《規格驅動全自動
Thumbnail
看更多