380. Insert Delete GetRandom O(1)
by Botao Xiao
Question
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.
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();
Solution
- Method 1: HashMap + ArrayList
class RandomizedSet { private Map<Integer, Integer> map; private List<Integer> nums; private Random random; /** Initialize your data structure here. */ public RandomizedSet() { this.map = new HashMap<>(); this.nums = new ArrayList<>(); this.random = new Random(); } /** 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; nums.add(val); map.put(val, nums.size() - 1); return true; } /** Removes a value from the set. Returns true if the set contained the specified element. */ public boolean remove(int val) { if(!map.containsKey(val)) return false; int index = map.get(val); if(index != nums.size() - 1){ int last = nums.get(nums.size() - 1); nums.set(index, last); map.put(last, index); } nums.remove(nums.size() - 1); map.remove(val); return true; } /** Get a random element from the set. */ public int getRandom() { return this.nums.get(random.nextInt(nums.size())); } } /** * Your RandomizedSet object will be instantiated and called as such: * RandomizedSet obj = new RandomizedSet(); * boolean param_1 = obj.insert(val); * boolean param_2 = obj.remove(val); * int param_3 = obj.getRandom(); */
Amazon session
class RandomizedSet {
private Random random;
private Map<Integer, Integer> map;
private List<Integer> list;
/** Initialize your data structure here. */
public RandomizedSet() {
this.random = new Random();
this.map = new HashMap<>(); //key: given key, value: index in the array list
this.list = new ArrayList<>();
}
/** 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;
int size = list.size();
map.put(val, size);
list.add(val);
return true;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
public boolean remove(int val) {
if(!map.containsKey(val)) return false;
int last = list.get(list.size() - 1); //last value
int index = map.get(val);
if(index != list.size() - 1){
list.set(index, last);
map.put(last, index);
}
// we set the value at index to last and remove the last in the list.
list.set(index, last);
map.remove(val);
list.remove(list.size() - 1);
return true;
}
/** Get a random element from the set. */
public int getRandom() {
int rand = random.nextInt(list.size());
return list.get(rand);
}
}
/**
* Your RandomizedSet object will be instantiated and called as such:
* RandomizedSet obj = new RandomizedSet();
* boolean param_1 = obj.insert(val);
* boolean param_2 = obj.remove(val);
* int param_3 = obj.getRandom();
*/
Subscribe via RSS