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 猪猪🐷 阅读(111) 评论(0) 收藏 举报
浙公网安备 33010602011771号