381. Insert Delete GetRandom O - Duplicates allowed

Posted tobeabetterpig

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了381. Insert Delete GetRandom O - Duplicates allowed相关的知识,希望对你有一定的参考价值。

381. Insert Delete GetRandom O(1) - Duplicates allowed


https://www.youtube.com/watch?v=mRTgft9sBhA

这个自己写写,花花讲的思路还行

https://zxi.mytechroad.com/blog/hashtable/leetcode-381-insert-delete-getrandom-o1-duplicates-allowed/


没通过

class RandomizedCollection {

    /** Initialize your data structure here. */
  
    class Entry{
      public int value;
      public int index;
      public Entry(int val, int idx){
        value = val;
        index = idx;
      }
    }
  
  
    private  HashMap<Integer, List<Integer>> map;
    private List<Entry> vals;
    private Random rand;
  
  
    public RandomizedCollection() {
      map = new HashMap<>();
      vals = new ArrayList<>();
      rand = new Random();
        
    }
    
    /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */
    public boolean insert(int val) {
      if(!map.containsKey(val)){
        map.put(val, new ArrayList<>());
      }
      List<Integer> list = map.get(val);
      list.add(vals.size());
      map.put(val, list);
      vals.add(new Entry(val, list.size()-1));
      return list.size() == 1;
        
    }
    
    /** Removes a value from the collection. Returns true if the collection contained the specified element. */
    public boolean remove(int val) {
      if(!map.containsKey(val)) return false;
      
      // need to get the index of the removing value in the list<entry>
      List<Integer> list = map.get(val);
      int size = list.size();
      int lastIndex = list.get(size -1);
      list.remove(size-1);
      if(list.size() == 0){
        map.remove(val);
      }
      
      // get the value from the last slot in the list<entry>
      int listSize = vals.size();
      Entry lastSlot = vals.get(listSize - 1);
      int lvalue = lastSlot.value;
      int lindex = lastSlot.index;
      
      map.get(lvalue).set(lindex,lastIndex);
      
      // swap the removing slot with the last slot 
      vals.set(lastIndex, lastSlot);
      vals.remove(listSize - 1);
      return true;
      
    }
    
    /** Get a random element from the collection. */
    public int getRandom() {
      return vals.get(rand.nextInt(vals.size())).value;
        
    }
}  

 

以上是关于381. Insert Delete GetRandom O - Duplicates allowed的主要内容,如果未能解决你的问题,请参考以下文章

381. Insert Delete GetRandom O - Duplicates allowed - Hard

leetcode 381.Insert Delete GetRandom

leetcode 381 Insert Delete GetRandom O - Duplicates allowed

LeetCode 381. Insert Delete GetRandom O - Duplicates allowed (插入删除和获得随机数 常数时间 允许重复项)

381 Insert Delete GetRandom O - Duplicates allowed O 时间插入删除和获取随机元素 - 允许重复

触发器