题意是通过一个数据结构来实现常数时间内的该三个操作。第一反应肯定是数组,数组能够完成获得随机元素的任务,但是要进行对某一元素的删除则存在困难。假如我们一拿到需要删除的数据,就能立马找到这个数据在数组中的下标,那就是可以在常数时间内实现的。这个操作则可以通过哈希表来实现,在往结构中添加数据的时候,将该数据作为键值加入哈希表,其value为当前数组中元素个数,举个例子,假如当前结构内有1个元素,添加一个元素时,当前大小为1,新元素在其中的索引就是1。删除操作则比较巧妙,可以直接将最后一位数据赋给所需要删除的数据所在的位置完成覆盖,然后将最后一位数据弹出,这样就完成了常数时间的插入和删除。贴代码
1 class RandomizedSet { 2 public: 3 unordered_map<int,int> nums_map; 4 vector<int> nums; 5 /** Initialize your data structure here. */ 6 RandomizedSet() 7 { 8 9 } 10 11 /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */ 12 bool insert(int val) 13 { 14 if(nums_map.count(val) == 1) 15 return false; 16 nums_map[val] = nums.size(); 17 nums.push_back(val); 18 return true; 19 } 20 21 /** Removes a value from the set. Returns true if the set contained the specified element. */ 22 bool remove(int val) 23 { 24 if(nums_map.count(val) == 0) 25 return false; 26 int temp = nums.back(); 27 nums[nums_map[val]] = nums.back(); 28 nums.pop_back(); 29 nums_map[temp] = nums_map[val]; 30 nums_map.erase(val); 31 return true; 32 } 33 34 /** Get a random element from the set. */ 35 int getRandom() 36 { 37 return nums[rand()%nums.size()]; 38 } 39 }; 40 41 /** 42 * Your RandomizedSet object will be instantiated and called as such: 43 * RandomizedSet* obj = new RandomizedSet(); 44 * bool param_1 = obj->insert(val); 45 * bool param_2 = obj->remove(val); 46 * int param_3 = obj->getRandom(); 47 */