数组380. 常数时间插入删除和获取随机元素
Posted ocpc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组380. 常数时间插入删除和获取随机元素相关的知识,希望对你有一定的参考价值。
题目:
解答:
此题的正确解法是利用到了一个一维数组和一个 HashMap,其中数组用来保存数字,HashMap 用来建立每个数字和其在数组中的位置之间的映射。
- 插入操作——先看这个数字是否已经在 HashMap 中存在,如果存在的话直接返回 false,不存在的话,将其插入到数组的末尾,然后建立数字和其位置的映射(map的第一个参数是元素的值,第二个参数是该值在数组中的下标)
- 删除操作——比较 tricky 的,还是要先判断其是否在 HashMap 里,如果没有,直接返回 false。由于 HashMap 的删除是常数时间的,而数组并不是,为了使数组删除也能常数级,实际上将要删除的数字和数组的最后一个数字调换个位置,然后修改对应的 HashMap 中的值,这样只需要删除数组的最后一个元素即可,保证了常数时间内的删除
- 返回随机数——对于数组来说就很简单了,只要随机生成一个位置,返回该位置上的数字即可
1 class RandomizedSet { 2 public: 3 /** Initialize your data structure here. */ 4 RandomizedSet() { 5 6 } 7 8 /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */ 9 bool insert(int val) 10 { 11 if (m.count(val)) 12 { 13 return false; 14 } 15 nums.push_back(val); 16 m[val] = nums.size() - 1; 17 return true; 18 19 } 20 21 /** Removes a value from the set. Returns true if the set contained the specified element. */ 22 bool remove(int val) { 23 if (!m.count(val)) 24 { 25 return false; 26 } 27 int last = nums.back(); 28 m[last] = m[val]; 29 nums[m[val]] = last; 30 nums.pop_back(); 31 m.erase(val); 32 return true; 33 34 } 35 36 /** Get a random element from the set. */ 37 int getRandom() { 38 return nums[rand() % nums.size()]; 39 } 40 41 private: 42 vector<int> nums; 43 unordered_map<int, int> m; 44 45 };
以上是关于数组380. 常数时间插入删除和获取随机元素的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 380 O时间插入删除和获取随机元素[Map 数组] HERODING的LeetCode之路
题目地址(1/“>380. O 时间插入删除和获取随机元素)
LeetCode 380. Insert Delete GetRandom O (插入删除和获得随机数 常数时间)
LeetCode 806. 写字符串需要的行数 / 380. O 时间插入删除和获取随机元素 / 1672. 最富有客户的资产总量