classRandomizedCollection { public: /** Initialize your data structure here. */ RandomizedCollection() { } unordered_map<int, unordered_set<int>> index; vector<int> nums; /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */ boolinsert(int val) { nums.push_back(val); index[val].insert(nums.size() - 1); return index[val].size() == 1; }
/** Removes a value from the collection. Returns true if the collection contained the specified element. */ boolremove(int val) { if (index[val].size() == 0)//如果这个值的set中不存在元素了,则证明该值元素为空 returnfalse; int i = *(index[val].begin()); nums[i] = nums[nums.size() - 1]; index[val].erase(i); index[nums[i]].erase(nums.size() - 1); if (i < nums.size() - 1)//需要判断操作数的位置,否则可能会造成刚刚删除过索引,然后又加回来的情况。。 { index[nums[i]].insert(i); } nums.pop_back(); returntrue; }
/** Get a random element from the collection. */ intgetRandom() { if (nums.size() == 0)//判断数组大小,如果为0的话是不能取余的 return-1; return nums[rand() % nums.size()]; } };