• LeetCode 380. Insert Delete GetRandom O(1)


    380. Insert Delete GetRandom O(1)

    Description Submission Solutions

    • Total Accepted: 21771
    • Total Submissions: 56175
    • Difficulty: Medium
    • Contributors: Admin

    Design a data structure that supports all following operations in average O(1) time.

    1. insert(val): Inserts an item val to the set if not already present.
    2. remove(val): Removes an item val from the set if present.
    3. getRandom: Returns a random element from current set of elements. Each element must have the same probability of being returned.

    Example:

    // Init an empty set.
    RandomizedSet randomSet = new RandomizedSet();
    
    // Inserts 1 to the set. Returns true as 1 was inserted successfully.
    randomSet.insert(1);
    
    // Returns false as 2 does not exist in the set.
    randomSet.remove(2);
    
    // Inserts 2 to the set, returns true. Set now contains [1,2].
    randomSet.insert(2);
    
    // getRandom should return either 1 or 2 randomly.
    randomSet.getRandom();
    
    // Removes 1 from the set, returns true. Set now contains [2].
    randomSet.remove(1);
    
    // 2 was already in the set, so return false.
    randomSet.insert(2);
    
    // Since 2 is the only number in the set, getRandom always return 2.
    randomSet.getRandom();
    

    Subscribe to see which companies asked this question.

    【题目分析】

    设计一种数据结构,使得插入,删除和随机获取一个值的时间复杂度为O(1).

    【思路】

    1. 随机读取一个数的话,使用数组的时间复杂度是最小的,因为通过下标可以直接定位。考虑到元素会不断插入,我们可以选择ArrayList来存储我们的元素。

    2. 要删除一个元素,在数组中需要遍历才能找到这个元素。而在HashMap中,可以快速定位一个元素。因此我们可以用HashMap来存储元素和它在ArrayList中对应的下标。

    通过以上的分析,我们知道了数据结构该如何设计。

    【java代码】

     1 public class RandomizedSet {
     2     Map<Integer, Integer> map;
     3     List<Integer> list;
     4     Random random;
     5 
     6     /** Initialize your data structure here. */
     7     public RandomizedSet() {
     8         map = new HashMap<>();
     9         list = new ArrayList<>();
    10         random = new Random();
    11     }
    12     
    13     /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
    14     public boolean insert(int val) {
    15         if(map.containsKey(val)) return false;
    16         map.put(val, list.size());
    17         list.add(val);
    18         return true;
    19     }
    20     
    21     /** Removes a value from the set. Returns true if the set contained the specified element. */
    22     public boolean remove(int val) {
    23         if(!map.containsKey(val)) return false;
    24         int loc = map.get(val);
    25         if(loc < list.size()-1) {
    26             int last = list.get(list.size()-1);
    27             list.set(loc, last);
    28             map.put(last, loc);
    29         }
    30         map.remove(val);
    31         list.remove(list.size()-1);
    32         return true;
    33     }
    34     
    35     /** Get a random element from the set. */
    36     public int getRandom() {
    37         return list.get(random.nextInt(list.size()));
    38     }
    39 }
    40 
    41 /**
    42  * Your RandomizedSet object will be instantiated and called as such:
    43  * RandomizedSet obj = new RandomizedSet();
    44  * boolean param_1 = obj.insert(val);
    45  * boolean param_2 = obj.remove(val);
    46  * int param_3 = obj.getRandom();
    47  */
  • 相关阅读:
    少写代码帮你模块化方法 & 运动框架 & 简化轮播图
    JQ
    弹框&可用于判断
    移动端内容区域滚动做法总结
    数组这回事
    Bootstrap & 响应式
    谈谈this对象
    模态框中水平垂直居的问题
    图片的懒加载问题
    js中运动框架的封装
  • 原文地址:https://www.cnblogs.com/liujinhong/p/6442691.html
Copyright © 2020-2023  润新知