数组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. 常数时间插入删除和获取随机元素的主要内容,如果未能解决你的问题,请参考以下文章

380. O 时间插入删除和获取随机元素

LeetCode 380 O时间插入删除和获取随机元素[Map 数组] HERODING的LeetCode之路

题目地址(1/“>380. O 时间插入删除和获取随机元素)

LeetCode 380. Insert Delete GetRandom O (插入删除和获得随机数 常数时间)

LeetCode 806. 写字符串需要的行数 / 380. O 时间插入删除和获取随机元素 / 1672. 最富有客户的资产总量

[leetcode]380. Insert Delete GetRandom O常数时间插入删除取随机值