题目链接
英文链接:https://leetcode.com/problems/insert-delete-getrandom-o1/
中文链接:https://leetcode-cn.com/problems/insert-delete-getrandom-o1/
题目详述
设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构。
insert(val)
:当元素 val 不存在时,向集合中插入该项。remove(val)
:元素 val 存在时,从集合中移除该项。getRandom
:随机返回现有集合中的一项。每个元素应该有相同的概率被返回。
示例 :
1 | // 初始化一个空的集合。 |
题目详解
insert(val)
和remove(val)
操作都要达到O(1)
,运用哈希结构是比较合适的。- 因为要求随机获取元素,可以用
Math.random()
乘以总元素的大小就得到了索引。因此索引必须是有序的,并且要把元素与索引关联起来。 - 采取的方案是运用两个哈希表
keyMap
、indexMap
和一个整形变量size
。 keyMap
用来记录元素到索引的映射,indexMap
用来记录索引到元素的映射,size
用来记录这个容器中元素的数量。- 当插入一个元素时,分别向两个哈希表插入元素,并更新
size
。 - 当删除元素时,若删除的是最后插入的元素,可以直接删除;否则把最后插入的元素转移到删除的位置,并更新
size
。这样维持这个容器的有序性。 - 当随机获取元素时,运用随机函数得到索引,取得与之关联的元素。
1 | public class LeetCode_00380 { |