contributed by < Xx-oX
>
1
利用 Hash Table 解決 LeetCode 1. Two Sum
考慮以下實作,補完(AAA, BBB)並解釋運作原理(延伸題目 1)
尋訪所有 nums 中的數字,在 Hash table 中找尋是否有 target 減去該數字的值
如果沒有就將此數字加入 Hash table
加入數字到 Hash table 時會先檢查是否已經存在了,如果沒有就在 hlist_head
陣列中相應 index 值的串列開頭加入新的節點 (參考下方說明)
hlist_head
: Hash table 的起始節點,可以節省起始端 **pprev
的空間hlist_node
: Hash table 的節點,其中 **pprev
是上一個節點的指標的指標,用來直接存取上一個節點的 *next
,以便在 的時間複雜度內完成加入 list 之類的操作hash_key
: 用來存放資料的 bucket 底部用 hlist_node
連結,跟 lab0
中的 element_t
相似map_t
: 整個 Hash table 的起始,其中 bits
表示 Hash table 的大小,ht
則指向 hlist_head
的陣列map_init
: 初始化整個 Hash table 以及 hlist_head
陣列
hash
: 此 Hash table 的 Hash function,回傳(val * GOLDEN_RATIO_32) >> (32 - bits)
作為 Hash table 的 index
find_key
: 查詢 Hash table 中有無某個 Key 值的資料,有的話回傳該 hash_key
map_get
: 包裝 find_key
,給最後 twoSum
做整數運算
回傳型態為 void* ,待後續呼叫作顯式轉型
map_add
: 新增一筆資料到 Hash table 中
map_deinit
: 斷開 Hash table 中的連結,並釋放占用的記憶體空間
two_sum
: 解決問題的主程式,在 Hash table 中查找有無符合條件的數字
AAA 應填入 n->next = first
由後三行程式碼可以發現是將新節點 n
接在 list 的開頭
BBB 應填入 n->pprev = &h->first
,將 n
與 h
相連 (從上一行 h->first = n
得知)
結果如下圖
2
考慮以下針對 LeetCode 82. Remove Duplicates from Sorted List II 的實作
填入 COND1 及 COND2,並
目標是要在已排序的串列中刪除重複的節點
故 COND1 應填入 head->next && head->value == head->next->value
檢查此節點的值是否等於下個節點的值,其中需要檢查下個節點是否存在
而 COND2 那行的 while 是為了尋訪後續數值相同的節點,所以條件與 COND1 相同,填入
head->next && head->value == head->next->value
改寫自 Xx-oX/lab0-c 當中的 q_delete_dup
,使用 pointer to pointer
的技巧來連接節點
參見 Xx-oX/lab0-c 當中的 q_delete_dup
3
考慮以下針對 LeetCode 146. LRU Cache 的實作
填入 MMM1, MMM2, MMM3 以及 MMM4,並
MMM1 應填入 list_for_each_entry_safe
,作用是要釋出記憶體,故使用安全的遍歷版本
MMM2 與 MMM3 應填入 list_for_each_entry
,作用是在 obj->hheads[hash]
中遍歷,並使用對應的 entry
MMM4 應填入 list_last_entry
,作用是移除串列最後的節點
4
考慮以下針對 LeetCode 128. Longest Consecutive Sequence 的實作
填入 LLL 及 RRR,並
LLL 應填入 --left
RRR 應填入 ++right
從 left
, right
的初始值都是 num
即可判斷是要先做加減 (preinc, predec)
而 left
往左移動,故減 1 ; right
往右移動,故加 1,相當直覺