第一次接觸 Leetcode 時,看到題目時直接傻住,因為題目都是英文,光是理解題意就讓我非常頭疼。那時,我發現自己的英文能力不足,甚至無法讀懂問題描述。
為了克服這個障礙,我決定開始研究 Leetcode 。一邊鑽研演算法,一邊補充過去沒有學好的基礎知識。對許多工程師來說,英文的確是一道難關,我希望我的經歷能幫助到那些和我一樣,英文不夠好但依然不願放棄學習的人。
我認為在學習演算法的過程中,TypeScript 是一個很好的語言選擇。它既具備強大的型別系統,又能靈活地應用在前端和後端的場景中。這次我的目標是挑戰 「Leetcode 熱題100」。每天隨機選取一題,利用 TypeScript 來解決問題,解完後再看看是否能進行優化。通過這樣的方式,不僅提升演算法能力,也鍛鍊程式碼優化的思維。
接下來,我們將從 Leetcode 中的經典問題之一——「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.
題目描述: 給定一個整數數組 nums
和一個目標值 target
,請你在該數組中找出和為目標值的那 兩個 數字,並返回它們的索引。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能重複使用。
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]
const map = new Map<number, number>();
// 用來儲存數字和它的索引
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i]; // 計算補數
if (map.has(complement)) {
// 如果補數存在於map中,則返回其索引與當前索引
return [map.get(complement)!, i];
}
// 將當前數字和索引存入map
map.set(nums[i], i);
}
Map
Map
去找這個「補數」,找到就返回。這種方法的時間複雜度為 O(n),因為我們只需迴圈一次數組,同時每次查找和插入哈希表的時間複雜度都是 O(1)
這樣,我們成功解決了 Leetcode 熱題100 中的第一題 Two Sum。
「哈希表」(Hash Table)是一種非常高效的資料結構,用來實現 快速查找
、插入
和刪除
操作。它的核心概念是通過 鍵值對 的形式來儲存資料,也就是說,每個資料都有一個唯一的「鍵」(key),用來對應一個「值」(value)。這樣,我們可以根據「鍵」迅速找到對應的「值」。
哈希表的效率源自於 哈希函數。當你把「鍵」輸入哈希函數時,哈希函數會根據「鍵」計算出一個唯一的數字,稱為「哈希值」。這個哈希值會用來定位存儲資料的位置。因此,通過哈希表,我們可以在常數時間內(O(1))快速查找到我們想要的東西。
在實際應用中,哈希表被用於很多場景,比如:
哈希表的操作非常高效,是解決查找問題時常用的資料結構之一。