231. Insert Delete GetRandom O(1) - Duplicates allowed
`RandomizedCollection` is a data structure that contains a collection of numbers, possibly duplicates (i.e., a multiset). It should support inserting and removing specific elements and also reporting a random element. Implement the `RandomizedCollection` class: - `RandomizedCollection()` Initializes the empty `RandomizedCollection` object. - `bool insert(int val)` Inserts an item `val` into the multiset, even if the item is already present. Returns `true` if the item is **not** present, `false` otherwise. - `bool remove(int val)` Removes an item `val` from the multiset if present. Returns `true` if the item is present, `false` otherwise. Note that if `val` has multiple occurrences in the multiset, we only remove one of them. - `int getRandom()` Returns a random element from the current multiset of elements. The probability of each element being returned is **linearly related** to the number of the same values the multiset contains. You must implement the functions of the class such that each function works on **average** `O(1)` time complexity.
Examples
Input: ["RandomizedCollection","insert","getRandom","insert","remove","getRandom"] [[],[5],[],[5],[5],[]]
Output: [null,true,5,false,true,5]
Explanation: getRandom is queried only when every element equals 5, so it deterministically returns 5.
Constraints
- -2^31 <= val <= 2^31 - 1
- At most 2 * 10^5 calls in total will be made to insert, remove, and getRandom.
- There will be at least one element in the data structure when getRandom is called.
Run checks all cases above. Submit evaluates all test cases.