今天的每日一題是leetcode705. 設計雜湊集合,題意如下:
不使用任何內建的雜湊表庫設計乙個雜湊集合(hashset)。首先我們想到的方法是用乙個標記陣列標記所有的數字,這種方法雖然能o(1)的實現各種操作。但是這種方法的缺點是需要的空間太大,資料範圍多大就得開多大的陣列。顯然這種方法不是高效率的演算法。實現 myhashset 類:
void add(key) 向雜湊集合中插入值 key 。
bool contains(key) 返回雜湊集合中是否存在這個值 key 。
void remove(key) 將給定值 key 從雜湊集合中刪除。如果雜湊集合中沒有這個值,什麼也不做。
我們可以使用折中的方法,陣列中每乙個地方可以不止放乙個數。我們可以把很多數字放在乙個固定的區域內,用取餘的方法確定每個數的位置。這樣我們進行操作時只需要在這個數對應的位置找就可以了。這裡我們使用鍊錶來實現。這裡取餘的值取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 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...