iT邦幫忙

2024 iThome 鐵人賽

DAY 1
2

https://ithelp.ithome.com.tw/upload/images/20240915/20124462aSb15IcmZf.jpg

為什麼學習演算法?

第一次接觸 Leetcode 時,看到題目時直接傻住,因為題目都是英文,光是理解題意就讓我非常頭疼。那時,我發現自己的英文能力不足,甚至無法讀懂問題描述。

為了克服這個障礙,我決定開始研究 Leetcode 。一邊鑽研演算法,一邊補充過去沒有學好的基礎知識。對許多工程師來說,英文的確是一道難關,我希望我的經歷能幫助到那些和我一樣,英文不夠好但依然不願放棄學習的人。

設定目標

我認為在學習演算法的過程中,TypeScript 是一個很好的語言選擇。它既具備強大的型別系統,又能靈活地應用在前端和後端的場景中。這次我的目標是挑戰 「Leetcode 熱題100」。每天隨機選取一題,利用 TypeScript 來解決問題,解完後再看看是否能進行優化。通過這樣的方式,不僅提升演算法能力,也鍛鍊程式碼優化的思維。

接下來,我們將從 Leetcode 中的經典問題之一——「Two Sum」開始

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);

}

解題脈絡:

  1. 看到題目的本身就是知道可以用哈希表Map
  2. 跑for loop 的時候算一下這個數字跟目標值之間的差「補數」
  3. 算好後就去Map去找這個「補數」,找到就返回。
  4. 如果補數沒有,不是當前這個,則將當前數字和索引存入哈希表,跑到沒元素為止。

這種方法的時間複雜度為 O(n),因為我們只需迴圈一次數組,同時每次查找和插入哈希表的時間複雜度都是 O(1)

這樣,我們成功解決了 Leetcode 熱題100 中的第一題 Two Sum

https://ithelp.ithome.com.tw/upload/images/20240915/20124462Aw8B0zi71u.png

本次要點:

「哈希表」(Hash Table)是一種非常高效的資料結構,用來實現 快速查找插入刪除操作。它的核心概念是通過 鍵值對 的形式來儲存資料,也就是說,每個資料都有一個唯一的「鍵」(key),用來對應一個「值」(value)。這樣,我們可以根據「鍵」迅速找到對應的「值」。

哈希表的效率源自於 哈希函數。當你把「鍵」輸入哈希函數時,哈希函數會根據「鍵」計算出一個唯一的數字,稱為「哈希值」。這個哈希值會用來定位存儲資料的位置。因此,通過哈希表,我們可以在常數時間內(O(1))快速查找到我們想要的東西。

在實際應用中,哈希表被用於很多場景,比如:

  • 查找資料是否存在
  • 快速統計和記錄元素出現的次數
  • 快速存取元素

哈希表的操作非常高效,是解決查找問題時常用的資料結構之一。


下一篇
Day02 X Leetcode:三數之和 3Sum
系列文
TypeScript X Leetcode:精進演算法,掌握技術詞30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言