leetcode-380. O(1) 时间插入、删除和获取随机元素
O(1) 时间插入、删除和获取随机元素
实现RandomizedSet
类:
RandomizedSet()
初始化RandomizedSet
对象bool insert(int val)
当元素val
不存在时,向集合中插入该项,并返回true
;否则,返回false
。bool remove(int val)
当元素val
存在时,从集合中移除该项,并返回true
;否则,返回false
。int getRandom()
随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。
你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1)
。
要求常数时间下插入和删除元素所以考虑哈希表。随机返回集合中的一项也就是可以对集合随机访问,但是哈希表不能做到这点,所以还要引入顺序表来支持随机访问。
这个题的处理方式很像静态链表,就是用数组构建的链表,链表在空间上是连续的。
设置哈希表hash<元素值,下标>
,动态数组a
。a
的下标对应hash
的下标,a
的元素值对应hash
的元素值。
对应关系稍微有点绕,写了两遍才完全搞明白。
总结一下unordered_map
和vector
的常用函数,经常容易忘,每次都要现查。
size() |
返回容量 |
---|---|
empty() |
容器为空返回true ,否则返回true |
find(key)//哈希表 |
若找到,返回对应迭代器,否则返回最后一个元素后一个位置的迭代器 |
begin() |
返回第一个元素/键值对的迭代器 |
end() |
返回最后一个位置后一个位置的迭代器 |
back()//vector |
返回vector 的最后一个元素 |
count(key)//哈希表 |
返回key 的个数 |
push_back(x)//vector |
插入x |
pop_back()//vector |
删除最后一个元素 |
erase(key)//哈希表 |
清除key |
1 | class RandomizedSet { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 面试资料!