天天看點

[LeetCode] Insert Delete GetRandom O(1) 常數時間内插入删除和獲得随機數

Design a data structure that supports all following operations in average O(1) time.

<code>insert(val)</code>: Inserts an item val to the set if not already present.

<code>remove(val)</code>: Removes an item val from the set if present.

<code>getRandom</code>: Returns a random element from current set of elements. Each element must have the same probability of being returned.

Example:

這道題讓我們在常數時間範圍内實作插入删除和獲得随機數操作,如果這道題沒有常數時間的限制,那麼将會是一道非常簡單的題,我們直接用一個set就可以搞定所有的操作。但是由于時間的限制,我們無法在常數時間内實作擷取随機數,是以隻能另辟蹊徑。此題的正确解法是利用到了一個一維數組和一個哈希表,其中數組用來儲存數字,哈希表用來建立每個數字和其在數組中的位置之間的映射,對于插入操作,我們先看這個數字是否已經在哈希表中存在,如果存在的話直接傳回false,不存在的話,我們将其插入到數組的末尾,然後建立數字和其位置的映射。删除操作是比較tricky的,我們還是要先判斷其是否在哈希表裡,如果沒有,直接傳回false。由于哈希表的删除是常數時間的,而數組并不是,為了使數組删除也能常數級,我們實際上将要删除的數字和數組的最後一個數字調換個位置,然後修改對應的哈希表中的值,這樣我們隻需要删除數組的最後一個元素即可,保證了常數時間内的删除。而傳回随機數對于數組來說就很簡單了,我們隻要随機生成一個位置,傳回該位置上的數字即可,參見代碼如下: