设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构。
注意: 允许出现重复元素。
insert(val):向集合中插入元素 val。
remove(val):当 val 存在时,从集合中移除一个 val。
getRandom:从现有集合中随机获取一个元素。每个元素被返回的概率应该与其在集合中的数量呈线性相关。
题目要求我们在时间复杂度在O(1)下执行上述所有操作,首先我们需要选择一个集合来存放数据,此处我们的选择是动态数组,对于动态数组来说,其在末尾插入元素的时间复杂度能够满足要求,就是O(1)。
对于移除操作来说,为了实现时间复杂度为O(1),我们需要用到一个哈希表,存储一个元素在集合中的所有下标,当需要删除该元素时,将该元素与集合的末尾元素交换位置,同时更新交换后末尾元素的下标变化,最后再删除集合的末尾元素。
对于随机获取一个元素,为了实现每个元素被返回的概率应该与其在集合中的数量呈线性相关,我们可以考虑设计随机函数得到集合范围内的任意一个下标,然后返回集合中该下标对应的元素。
class RandomizedCollection {
Map<Integer, Set<Integer>> index;
List<Integer> nums;
/** 初始化集合 */
public RandomizedCollection() {
index = new HashMap<Integer, Set<Integer>>();
nums = new ArrayList<Integer