码迷,mamicode.com
首页 > 编程语言 > 详细

【数组】380. 常数时间插入、删除和获取随机元素

时间:2020-05-05 17:38:33      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:read   span   remove   建立   ret   alt   red   lse   public   

题目:

技术图片

 

 

解答:

此题的正确解法是利用到了一个一维数组和一个 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. 常数时间插入、删除和获取随机元素

标签:read   span   remove   建立   ret   alt   red   lse   public   

原文地址:https://www.cnblogs.com/ocpc/p/12831410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!