package design; import java.util.*; /** * Created by gouthamvidyapradhan on 14/04/2018. 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(); * *
Solution O(1) for each operation. Maintain a hashmap of value -> {set of indices}; Set of
* indices are indices of array containing the value. Insert: Insert a element in end of array and
* add the index of array as the set of values in hashmap. Remove: If the hashmap contains value
* remove a random element from the set and replace the element at that index with the last element
* from array and remove the last element from the array. Since we are removing the last element
* from array this operation requires only O(1) time getRandom(): Generate a random number between 0
* and size of array and return the element at that position.
*/
public class RandomizedCollection {
private Map