题目链接:LeetCode 381—Insert Delete GetRandom O(1) - Duplicates allowed
AC代码:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Problem381 {
List<Integer> nums;
Map<Integer, Set<Integer>> map;
java.util.Random random;
/** Initialize your data structure here. */
public Problem381() {
// TODO Auto-generated constructor stub
} {
nums = new ArrayList<>();
map = new HashMap<>();
random = new java.util.Random();
}
/** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */
public boolean insert(int val) {
boolean doesContain = map.containsKey(val);
if(!doesContain) map.put(val, new HashSet<>());
map.get(val).add(nums.size());
nums.add(val);
return !doesContain;
}
/** 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;
if(!map.get(val).contains(nums.size()-1)) {
int currPos = map.get(val).iterator().next();
int lastVal = nums.get(nums.size() - 1);
map.get(lastVal).remove(nums.size() - 1);
map.get(lastVal).add(currPos);
map.get(val).remove(currPos);
map.get(val).add(nums.size() - 1);
nums.set(currPos, lastVal);
}
map.get(val).remove(nums.size()-1);
if(map.get(val).isEmpty()) map.remove(val);
nums.remove(nums.size()-1);
return true;
}
/** Get a random element from the collection. */
public int getRandom() {
return nums.get(random.nextInt(nums.size()));
}
}