380 Insert Delete GetRandom O(1)

380 Insert Delete GetRandom O(1)

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();
// hashmap: key: element, value: the index of this element in the list 
// list : for get random element 
// when remove an element: swap this element with the last element in the list, 
// and update the new location, 

// for example : 
// hashmap
// key: element: 2 4 3 
// val: index :  0 1 2
    
// list : 2 4 3 
    
// remove element 2 

// swap 2 and 3 
// so we have the hashmap as 
//   4 3 
//   1 0 
    
// removed 2 from the map 
// the list as 3 4 


class RandomizedSet {

    /** Initialize your data structure here. */
    private HashMap<Integer, Integer> map;
    private List<Integer> list;
    Random random; //////////
  
    public RandomizedSet() {
      map = new HashMap<>();
      list = new ArrayList<>();
      random = 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, list.size());
        list.add(val);
        return true;
      }else{
        return false;
      }
        
    }
    
    /** 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;
        }else{
            // think in high level : 
            // swap the last element and the element we need to delete 
            // this means, we need to do that and also need to update the location in the map as well
            int lastElement = list.get(list.size() - 1);
            int removeIndex = map.get(val);
            map.put(lastElement, removeIndex);
            list.set(removeIndex, lastElement); // list.set(index, val)
            map.remove(val);
            list.remove(list.size() - 1);
            return true;
        }
    }
    
    /** Get a random element from the collection. */
    public int getRandom() {
      return list.get(random.nextInt(list.size()));///// list.get(random.nextInt(list.size()))
       // list.get(RandomIndex)
      // randomIndex = random.nextInt(return any integer from 0 to n )
      // list.get(random.nextInt(list.size()))
            
        
    }
}

 

 

posted on 2018-08-10 14:41  猪猪&#128055;  阅读(111)  评论(0)    收藏  举报

导航