【題目】
設計一種結構,在該結構中有如下三個功能:
1、 insert(key):將某個key加入到該結構,做到不重複加入
2、delete(key):將原本在結構中的某個key移除
3、getrandom():等概率隨機返回結構中的任意乙個key
要求所有的操作時間複雜度都是o(1)。
【基本思路】
對每個元素都加上乙個下標,第乙個元素的下標為0,每加入乙個元素,對應的下標加1。如果要刪除乙個元素,假設該元素的下標為i,將最後的乙個元素放到位置i處,同時刪除最後乙個元素(對應的下標也刪除)。這樣處理就保證了下標的連續性,在進行getrandom操作的時候,只需要隨機產生乙個下標,將該下標位置處的元素返回即可。
為了得到key -> index以及index -> key的對應關係,使用兩個雜湊表來建立兩者之間的對映。
【**實現】
#python3.5
class pool:
def __init__(self):
self.keyindexmap = {}
self.indexkeymap = {}
self.index = 0
def insert(self, key):
self.keyindexmap[key] = self.index
self.indexkeymap[self.index] = key
self.index += 1
def delete(self, key):
if key in self.keyindexmap:
index = self.keyindexmap[key]
lastkey = self.indexkeymap[self.index-1]
self.indexkeymap[index] = lastkey
self.keyindexmap[lastkey] = index
del self.keyindexmap[lastkey]
del self.indexkeymap[self.index-1]
self.index -= 1
def getrandom(self):
if self.index == 0:
return none
index = int(random.random() * self.index)
return self.indexkeymap[index]
其他題目記錄
當乙個數為2的n 次方時,整個二進位制數,只有本位是1 其他位為0,如果我們給這個數減一,那麼本位變為0 其他位全部變成1 我們可以通過 運算,如果為0即為2的n次方 def is2n self,n if n 0 return true res n n 1 return res 0或者直接通過 re...
LeetCode 其他題目記錄
104.maximum depth of binary tree 和111很像,只是遞迴的結構略有不同,可簡單畫圖分析,求最大深度可以直接返回1 max 左子樹深度,右子樹深度 但是求最小深度時不可以,需要分別考慮左右子樹為空的情況。可以舉個反例子,比如,單斜樹。1 class solution 7...
其他題目 設計有setAll功能的雜湊表
題目 雜湊表常見的三個操作是put get和containskey,而且這三個操作的時間複雜度為o 1 現在想加乙個setall功能,就是把所有的記錄的value值都設成統一的值。請設計並實現這種有setall功能的雜湊表,並且put get containskey和setall四個操作的時間複雜度...