class RandomizedSet { public: /** Initialize your data structure here. */ RandomizedSet() { } /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */ bool insert(int val) { if(hash.count(val)) return false; hash[val] = vec.size(); vec.push_back(val); return true; } /** Removes a value from the set. Returns true if the set contained the specified element. */ bool remove(int val) { if(hash.count(val)==0) return false; int pos = hash[val]; hash[vec.back()] = pos; swap(vec[pos], vec[vec.size()-1]); hash.erase(val); vec.pop_back(); return true; } /** Get a random element from the set. */ int getRandom() { return vec[rand()%vec.size()]; } private: unordered_map<int, int> hash; vector<int> vec; }; /** * Your RandomizedSet object will be instantiated and called as such: * RandomizedSet obj = new RandomizedSet(); * bool param_1 = obj.insert(val); * bool param_2 = obj.remove(val); * int param_3 = obj.getRandom(); */
数据结构设计问题,从网上找的参考答案。
根据以上的思路,写了一份python版本的代码:
1 class RandomizedSet: 2 def __init__(self): 3 """ 4 Initialize your data structure here. 5 """ 6 self.dic = dict() 7 self.l = list() 8 self.length = 0 9 10 11 def insert(self, val: int) -> bool: 12 """ 13 Inserts a value to the set. Returns true if the set did not already contain the specified element. 14 """ 15 if val in self.dic: 16 return False 17 else: 18 self.dic[val] = self.length 19 self.l.append(val) 20 self.length += 1 21 return True 22 23 def remove(self, val: int) -> bool: 24 """ 25 Removes a value from the set. Returns true if the set contained the specified element. 26 """ 27 if val not in self.dic: 28 return False 29 else: 30 self.dic.pop(val) 31 self.l.remove(val) 32 self.length -= 1 33 return True 34 35 def getRandom(self) -> int: 36 """ 37 Get a random element from the set. 38 """ 39 rnd = int(random.uniform(0, self.length)) 40 key = self.l[rnd] 41 return key