Design a data structure that supports all following operations in average O(1) time.
insert(val): Inserts an item val to the set if not already present. remove(val): Removes an item val from the set if present. 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.RandomizedSetrandomSet=newRandomizedSet(); // 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();
Basic Idea:
这道题目是要求设计一个数据结构set,满足插入删除和getRandom,O(1) time for each operation.
class RandomizedSet {
Map<Integer, Integer> map = new HashMap<>();
List<Integer> list = new ArrayList<>();
/** Initialize your data structure here. */
public RandomizedSet() {}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
public boolean insert(int val) {
if (map.containsKey(val)) return false;
list.add(val);
map.put(val, list.size() - 1);
return true;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
public boolean remove(int val) {
// 现在map中找到val的index,和list中最后一个换位,更新换位元素在map中对应index,删掉需要删除的元素
Integer index = map.get(val);
if (index == null) return false;
// 如果index就是最后一个元素,则可以直接删除最后一个元素
if (index != list.size() - 1) {
// 将最后一个元素放入index,并更新map
list.set(index, list.get(list.size() - 1));
map.put(list.get(list.size() - 1), index);
}
list.remove(list.size() - 1);
map.remove(val);
return true;
}
/** Get a random element from the set. */
public int getRandom() {
int randIndex = (int)(Math.random() * (list.size()));
return list.get(randIndex);
}
}