<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【一天一道Leetcode】設(shè)計哈希集合

          共 2163字,需瀏覽 5分鐘

           ·

          2021-03-15 22:53


          本篇推文共計2000個字,閱讀時間約3分鐘。



          01


          題目描述


          題目描述:


          不使用任何內(nèi)建的哈希表庫設(shè)計一個

          哈希集合(HashSet)


          實(shí)現(xiàn) MyHashSet 類:
          void add(key)
          向哈希集合中插入值 key 。

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

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


          如下面的示例:


          輸入:
          ["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 ,(已移除)


          提示:

          1. 0 <= key <= 10^6

          2. 最多調(diào)用10^4次add、remove 和 contains。




          02


          方法和思路


          首先我們來科普一下哈希集合的概念。

          哈希集合是指能O(1)時間內(nèi)進(jìn)行插入和刪除,可以保存不重復(fù)元素的一種數(shù)據(jù)結(jié)構(gòu)。


          由于題目給出了0 <= key <= 10^6的數(shù)據(jù)范圍,

          同時限定了key只能是int。


          我們可以暴力求解,創(chuàng)建一個10^6 +1

          長度大小的數(shù)組。


          題目還強(qiáng)調(diào)

          只需要關(guān)注輸入的 key 是否存在,


          因此,我們把數(shù)組的元素統(tǒng)一設(shè)計成 bool 型的,
          當(dāng)某個 key 的對應(yīng)的數(shù)組中的位置取值為 true,說明該 key 存在,
          當(dāng)某個 key 的對應(yīng)的數(shù)組中的位置取值為 false,說明該 key 不存在。


          Python提供了bool類型來表示真(對)或假(錯)


          比如:
          1.常見的10 > 3比較算式,這個是正確的,在程序里稱為真,即我們眼中的對,
          Python 使用 True 來代表;

          2.常見的1 > 10比較算式,這個是錯誤的,在程序世界里稱之為假,即我們眼中的錯,
          Python 使用 False 來代表。


          但是這種方法:


          優(yōu)點(diǎn):查找和刪除的性能非常快,只用訪問 1 次數(shù)組,即時間復(fù)雜度為O(1);
          缺點(diǎn):使用了過大的空間,如果存儲的元素較少時,性價比較低,會占用較多緩存






          我們用代碼表示此題的解法如下:

          class MyHashSet:
              def __init__(self):
                  self.boolnodes=[False]*1000001

              def add(self, key):
                  self.boolnodes[key]=True

              def remove(self, key):
                  self.boolnodes[key]=False

              def contains(self, key):
                  return self.boolnodes[key]




          往期回顧

          【年終總結(jié)】你好2021,再見2020。


          【快速寫好畢業(yè)論文】你不得不知曉的七個常用文獻(xiàn)搜索平臺


          【秋招紀(jì)實(shí)錄】一篇特別正經(jīng)的【騰訊】求職經(jīng)驗分享


          【一天一道Leetcode】回文字符串-最少分割次數(shù)


          【一天一道Leetcode】用棧實(shí)現(xiàn)隊列


          【一天一道Leetcode】套信封問題



          ☆ END ☆

          你與世界

          只差一個

          公眾號

          瀏覽 40
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩城人网站 | 五月色小说 | 日韩A片免费看 | 色老板在线观看 | 国产精品视频播放豆花网址 |