2021.3.24
380. 常数时间插入、删除和获取随机元素
class RandomizedSet {
private LinkedList<Integer> nums;
private Map<Integer, Integer> valToIndex;
private Random rand = new Random();
/**
* Initialize your data structure here.
*/
public RandomizedSet() {
nums = new LinkedList<>();
valToIndex = new HashMap<>();
}
/**
* Inserts a value to the set. Returns true if the set did not already contain the specified element.
*/
public boolean insert(int val) {
if (valToIndex.containsKey(val)) {
return false;
}
valToIndex.put(val, nums.size());
nums.offerLast(val);
return true;
}
/**
* Removes a value from the set. Returns true if the set contained the specified element.
*/
public boolean remove(int val) {
if (!valToIndex.containsKey(val)) {
return false;
}
int index = valToIndex.get(val);
valToIndex.put(nums.getLast(), index);
Integer lastValue = nums.getLast();
nums.set(index, lastValue);
nums.removeLast();
valToIndex.remove(val);
return true;
}
/**
* Get a random element from the set.
*/
public int getRandom() {
return nums.get(rand.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();
*/
710. 黑名单中的随机数
class Solution {
Random rand;
private int sz;
private Map<Integer, Integer> mapping;
public Solution(int N, int[] blacklist) {
mapping = new HashMap<>();
rand = new Random();
sz = N - blacklist.length;
for (int b : blacklist) {
mapping.put(b, 666);
}
int last = N - 1;
for (int b : blacklist) {
if (b >= sz) {
continue;
}
while (mapping.containsKey(last)) {
last--;
}
mapping.put(b, last);
last--;
}
}
public int pick() {
int index = rand.nextInt(sz);
if (mapping.containsKey(index)) {
return mapping.get(index);
}
return index;
}
}
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(N, blacklist);
* int param_1 = obj.pick();
*/