在线客服 关于我们 联系我们
凯发k8娱乐登录-凯发k8娱乐官网-凯发k8娱乐官网app
新闻动态
联系我们
销售热线:
Contact Hotline
15899999999
传真:

E-mail:

公司地址:
当前位置: 官网首页 > 新闻动态 > 行业资讯 >
LeetCode380 常数时间插入、删除和获取随机元素
 

设计一个支持在平均 时间复杂度 o 下,执行以下操作的数据结构。
insert:当元素 val 不存在时,向集合中插入该项。
remove:元素 val 存在时,从集合中移除该项。
getrandom:随机返回现有集合中的一项。每个元素应该有相同的概率被返回。
示例 :





// 初始化一个空的集合。
randomizedset randomset = new randomizedset;
// 向集合中插入 1 。返回 true 表示 1 被成功地插入。
randomset.insert;
// 返回 false ,表示集合中不存在 2 。
randomset.remove;
// 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。
randomset.insert;
// getrandom 应随机返回 1 或 2 。
randomset.getrandom;
// 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。
randomset.remove;
// 2 已在集合中,所以返回 false 。
randomset.insert;
// 由于 2 是集合中唯一的数字,getrandom 总是返回 2 。
randomset.getrandom;

查找最快的数据结构为列表或者hash表,分别按照角标或者内容查找。
删除元素hash表时间复杂度为常数时间,但是列表则为线性时间,本题需要做特殊处理,对于要删除的元素采用交换到末尾的策略,然后删除末尾元素再更新对应的hash表。


class randomizedset {
public:
 /** initialize your data structure here. */
 randomizedset {
 /** inserts a value to the set. returns true if the set did not already contain the specified element. */
 bool insert {
 if != hashmap.end) {
 return false;
 vec.push_back;
 hashmap[val] = vec.size-1;
 return true;
 /** removes a value from the set. returns true if the set contained the specified element. */
 bool remove {
 if == hashmap.end) {
 return false;
 int index = hashmap.find - second;
 if - 1) {
 vec.pop_back;
 hashmap.erase;
 }else {
 hashmap[vec[vec.size-1]] = index;
 swap - 1]);
 vec.pop_back;
 hashmap.erase;
 return true;
 /** get a random element from the set. */
 int getrandom {
 if) {
 return -1;
 int index = rand % vec.size;
 return vec[index];
private:
 unordered_map int, int hashmap;
 vector int vec;
 * your randomizedset object will be instantiated and called as such:
 * randomizedset* obj = new randomizedset;
 * bool param_1 = obj- insert;
 * bool param_2 = obj- remove;
 * int param_3 = obj- getrandom;
 */
在线客服1
在线客服2
关注官方微信
返回顶部