Go語(yǔ)言題解LeetCode705設(shè)計(jì)哈希集合
題目描述
不使用任何內(nèi)建的哈希表庫(kù)設(shè)計(jì)一個(gè)哈希集合(HashSet)。
實(shí)現(xiàn) MyHashSet 類:
- void add(key) 向哈希集合中插入值 key 。
- bool contains(key) 返回哈希集合中是否存在這個(gè)值 key 。
- void remove(key) 將給定值 key 從哈希集合中刪除。如果哈希集合中沒有這個(gè)值,什么也不做。 示例:
輸入: ["MyHashSet", "add", "add", "contains", "contains", "add", "contains", "remove", "contains"] [[], [1], [2], [1], [3], [2], [2], [2], [2]] 輸出: [null, null, null, true, false, null, true, null, false] 解釋: MyHashSet myHashSet = new MyHashSet(); myHashSet.add(1); // set = [1] myHashSet.add(2); // set = [1, 2] myHashSet.contains(1); // 返回 True myHashSet.contains(3); // 返回 False ,(未找到) myHashSet.add(2); // set = [1, 2] myHashSet.contains(2); // 返回 True myHashSet.remove(2); // set = [1] myHashSet.contains(2); // 返回 False ,(已移除)
提示:
- 0 <= key <= 10^6
- 最多調(diào)用 10^4 次 add、remove 和 contains
思路分析
實(shí)現(xiàn)使用了鏈地址法,解決哈希沖突方法使用了模取余的方法(較簡(jiǎn)單的)。
這里說下為什么大家說模最好取質(zhì)數(shù),我的理解是取質(zhì)數(shù)可以讓取余后的結(jié)果更加均勻,以減少?zèng)_突。
舉個(gè)例子,假如我們?nèi)?為模,那么雖然理論上我們應(yīng)該會(huì)讓數(shù)字均勻落入4個(gè)桶中,但是對(duì)于下邊這個(gè)數(shù)組:
1,3,5,7,9
所有數(shù)字都落入了1,3兩個(gè)桶中,造成了極大的不均,導(dǎo)致哈希沖突發(fā)生頻繁。對(duì)于一個(gè)合數(shù),只要我們構(gòu)造合數(shù)倍數(shù)相關(guān)的數(shù)組,就很容易使哈希沖突變多,所以盡量選用質(zhì)數(shù)。
AC 代碼
struct Listnode{ int val; Listnode* next = nullptr; Listnode()=default; Listnode(int val){ this->val = val; } }; class MyHashSet { public: /** Initialize your data structure here. */ const int prime = 991; vector<Listnode*> nodes; MyHashSet(): nodes(prime, nullptr){ } void add(int key) { if(nodes[key%prime] == nullptr){ nodes[key%prime] = new Listnode(key); }else{ Listnode* node = nodes[key%prime]; while(node != nullptr){ if(node->val == key)return; node = node->next; } node = new Listnode(key); node->next = nodes[key%prime]; nodes[key%prime] = node; } } void remove(int key) { Listnode* prenode = nodes[key%prime]; if(prenode != nullptr && prenode->val == key){ if(prenode->next != nullptr){ nodes[key%prime] = prenode->next; delete prenode; }else{ delete prenode; nodes[key%prime] = nullptr; } return; } while(prenode != nullptr && prenode->next != nullptr){ if(prenode->next->val == key){ Listnode* temp = prenode->next; prenode->next = prenode->next->next; delete temp; return; } prenode = prenode->next; } } /** Returns true if this set contains the specif ied element */ bool contains(int key) { Listnode* node = nodes[key%prime]; while(node != nullptr){ if(node->val == key)return true; node = node->next; } return false; } }; /** * Your MyHashSet object will be instantiated and called as such: * MyHashSet* obj = new MyHashSet(); * obj->add(key); * obj->remove(key); * bool param_3 = obj->contains(key); */
以上就是Go語(yǔ)言題解LeetCode705設(shè)計(jì)哈希集合的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言設(shè)計(jì)哈希集合的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang 實(shí)現(xiàn)Socket服務(wù)端和客戶端使用TCP協(xié)議通訊
這篇文章主要介紹了Golang 實(shí)現(xiàn)Socket服務(wù)端和客戶端使用TCP協(xié)議通訊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-12-12golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析
這篇文章主要介紹了golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06go語(yǔ)言的panic和recover函數(shù)用法實(shí)例
今天小編就為大家分享一篇關(guān)于go語(yǔ)言的panic和recover函數(shù)用法實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04Go語(yǔ)言中Struct與繼承與匿名字段和內(nèi)嵌結(jié)構(gòu)體全面詳解
這篇文章主要介紹了Go語(yǔ)言中Struct與繼承與匿名字段和內(nèi)嵌結(jié)構(gòu)體,Go語(yǔ)言中通過結(jié)構(gòu)體的內(nèi)嵌再配合接口比面向?qū)ο缶哂懈叩臄U(kuò)展性和靈活性,感興趣的可以了解一下2023-04-04如何使用Goland IDE go mod 方式構(gòu)建項(xiàng)目
這篇文章主要介紹了如何使用Goland IDE go mod 方式構(gòu)建項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Goland使用delve進(jìn)行遠(yuǎn)程調(diào)試的詳細(xì)教程
網(wǎng)上給出的使用delve進(jìn)行遠(yuǎn)程調(diào)試,都需要先在本地交叉編譯或者在遠(yuǎn)程主機(jī)上編譯出可運(yùn)行的程序,然后再用delve在遠(yuǎn)程啟動(dòng)程序,本教程會(huì)將上面的步驟簡(jiǎn)化為只需要兩步,1,在遠(yuǎn)程運(yùn)行程序2,在本地啟動(dòng)調(diào)試,需要的朋友可以參考下2024-08-08