1
这题难点在于如何在删除的时候做到O1, 因为要随机访问毫无疑问你要用到数组加hash结构,感觉这确实是个新思路
2
新增和随机访问没什么好说的, 来看删除如何做到O1
3
问题 可以在hash里面保存元素对应的索引值, 但是如果删除了数组中间某个元素, 会导致后面的索引全部需要更新, 这样就不是O1了
解决: 假如数组有10个元素 要删除第5个, 不要直接删除第5个, 这样后面的元素索引都会减1, 因此把第五个和最后一个元素交换位置, 同时更新hash里面的两个元素的value;
最后删除数组最后一个元素.
4
如果删除的本来就是最后一个元素, 直接删除就好
1 class RandomizedSet { 2 public: 3 unordered_map<int,int> kv; 4 vector<int> index; 5 /** Initialize your data structure here. */ 6 RandomizedSet() { 7 srand(time(NULL)); 8 } 9 10 /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */ 11 bool insert(int val) { 12 if(kv.find(val)!=kv.end()) 13 return false; 14 index.push_back(val); 15 kv[val]=index.size()-1; 16 return true; 17 } 18 19 /** Removes a value from the set. Returns true if the set contained the specified element. */ 20 bool remove(int val) { 21 auto iter=kv.find(val); 22 if(iter==kv.end())return false; 23 if(iter->second<index.size()-1) 24 { 25 kv[index.back()]=iter->second; 26 index[iter->second]=index.back(); 27 } 28 kv.erase(iter); 29 index.pop_back(); 30 return true; 31 } 32 33 /** Get a random element from the set. */ 34 int getRandom() { 35 return index[rand()%index.size()]; 36 } 37 }; 38 39 /** 40 * Your RandomizedSet object will be instantiated and called as such: 41 * RandomizedSet obj = new RandomizedSet(); 42 * bool param_1 = obj.insert(val); 43 * bool param_2 = obj.remove(val); 44 * int param_3 = obj.getRandom(); 45 */