每日一題 Leetcode705 設計雜湊集合

2021-10-21 23:46:05 字數 1330 閱讀 3192

今天的每日一題是leetcode705. 設計雜湊集合,題意如下:

不使用任何內建的雜湊表庫設計乙個雜湊集合(hashset)。

實現 myhashset 類:

void add(key) 向雜湊集合中插入值 key 。

bool contains(key) 返回雜湊集合中是否存在這個值 key 。

void remove(key) 將給定值 key 從雜湊集合中刪除。如果雜湊集合中沒有這個值,什麼也不做。

首先我們想到的方法是用乙個標記陣列標記所有的數字,這種方法雖然能o(1)的實現各種操作。但是這種方法的缺點是需要的空間太大,資料範圍多大就得開多大的陣列。顯然這種方法不是高效率的演算法。

我們可以使用折中的方法,陣列中每乙個地方可以不止放乙個數。我們可以把很多數字放在乙個固定的區域內,用取餘的方法確定每個數的位置。這樣我們進行操作時只需要在這個數對應的位置找就可以了。這裡我們使用鍊錶來實現。這裡取餘的值取977是因為使用質數取餘可以保證餘數的均勻分布,降低衝突率。(具體可參考大佬的文章雜湊表除留取餘法的桶個數為什麼是質數)

c++參考**:

時間複雜度:o(n/b),其中 n為雜湊表中的元素數量,b 為鍊錶的數量。假設雜湊值是均勻分布的,則每個鍊錶大概長度為n/b。

參考資料

·力扣官方題解

·啥時候能畢業啊《雜湊表除留取餘法的桶個數為什麼是質數》

LeetCode 705 設計雜湊集合

問題描述 不使用任何內建的雜湊表庫設計乙個雜湊集合 具體地說,你的設計應該包含以下的功能 add value 向雜湊集合中插入乙個值。contains value 返回雜湊集合中是否存在這個值。remove value 將給定值從雜湊集合中刪除。如果雜湊集合中沒有這個值,什麼也不做。示例 myhas...

leetcode 705 設計雜湊集合

不使用任何內建的雜湊表庫設計乙個雜湊集合 hashset 實現 myhashset 類 void add key 向雜湊集合中插入值 key bool contains key 返回雜湊集合中是否存在這個值 key void remove key 將給定值 key 從雜湊集合中刪除。如果雜湊集合中沒...

每日一題 LeetCode

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...