(Array, hashtable, design) leetcode 380. Insert Delete GetRandom
注意:对于insert操作,这个将插入的元素若存在,返回false,否则插入。
对于delete操作,删除成功后返回true;若hashtable中不存在这个元素返回false。
思路:insert和delete操作用unordered_map来实现O(1)的时间复杂度,但是不方便随机取出一个元素;GetRandom 用 一个数组vector来随机取数。
class RandomizedSet { public: unordered_map<int, int> mp; //(val, index) vector<int> vals; //数组存储元素,便于getRandom操作 /** 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(mp.find(val) != mp.end()) return false; //数组中已经存在此元素 mp[val] = vals.size(); //mp 的value 为 数组中对应元素的索引 vals.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(mp.find(val) == mp.end()) return false; //找不到对应元素 int index = mp[val]; //index为要删除元素在数组中的位置 mp[vals.back()] = index; //因为要把数组中val和最后一个元素交换位置,所以将mp中最后一个元素的索引替换为val的索引 mp.erase(val); swap(vals[index], vals.back() ); //将val和最后一个元素交换位置后删除最后一个元素,即val vals.pop_back(); return true; } /** Get a random element from the set. */ int getRandom() { int index = rand()%vals.size(); //取随机值 return vals[index]; } }; /** * 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(); */