Design a data structure that supports all following Operations in average O(1) time.
Note: Duplicate elements are allowed.insert(val)
: Inserts an item val to the collection.remove(val)
: Removes an item val from the collection if PResent.getRandom
: Returns a random element from current collection of elements. The probability of each element being returned is linearly related to the number of same value the collection contains.Example:
// Init an empty collection.RandomizedCollection collection = new RandomizedCollection();// Inserts 1 to the collection. Returns true as the collection did not contain 1.collection.insert(1);// Inserts another 1 to the collection. Returns false as the collection contained 1. Collection now contains [1,1].collection.insert(1);// Inserts 2 to the collection, returns true. Collection now contains [1,1,2].collection.insert(2);// getRandom should return 1 with the probability 2/3, and returns 2 with the probability 1/3.collection.getRandom();// Removes 1 from the collection, returns true. Collection now contains [1,2].collection.remove(1);// getRandom should return 1 and 2 both equally likely.collection.getRandom();这里的结构允许出现重复的数字,且在随机选取某个数时,概率相等.
仍然用hash表,但记录val在数组中的位置用set。
class RandomizedCollection { map<int,set<int>> locs;//val to loc vector<int> nums;public: /** Initialize your data structure here. */ RandomizedCollection() { } /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */ bool insert(int val) { nums.push_back(val); locs[val].insert(nums.size()-1); if(locs[val].size()==1) return 1; else return 0; } /** Removes a value from the collection. Returns true if the collection contained the specified element. */ bool remove(int val) { if(locs.find(val)==locs.end()) return 0; int idx=*locs[val].begin(); int last=nums[nums.size()-1]; nums[idx]=last; locs[val].erase(idx);//这里必须先删除一个才可以插入,如果last和val相等,先插入,会没有效果。这里调试了好久才找到错误 locs[last].insert(idx); locs[last].erase(nums.size()-1); nums.pop_back(); if(locs[val].size()==0) locs.erase(val); return 1; } /** Get a random element from the collection. */ int getRandom() { return nums[rand()%nums.size()]; }};
新闻热点
疑难解答