黑名单中的随机数
有效的弄在左边 0,sz ,黑名单的弄在右边。
1映射到3即可
class Solution {
Map<Integer,Integer> map;
int sz;
Random random;
public Solution(int n, int[] blacklist) {
map=new HashMap<>();
random=new Random();
sz=n-blacklist.length;//有效范围
for(int x:blacklist){
map.put(x,666);//创造黑名单映射
}
int last=n-1;
int count=blacklist.length;
for(int b:blacklist){//遍历黑名单所有的,重新映射
if(b>=sz){
continue;
}
while(map.containsKey(last)){//这里要写while可能有黑名单数连一起情况
last--;
}
map.put(b,last);
last--;
}
}
public int pick() {
int index=random.nextInt(sz);
if(map.containsKey(index)){
return map.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();
*/
常数时间删除-查找数组中的任意元素
用数组来存值,hashmap存索引
class RandomizedSet {
List<Integer> nums;
Map<Integer,Integer> map;
Random random;
public RandomizedSet() {
nums=new ArrayList<>();
map=new HashMap<>();
random=new Random();
}
public boolean insert(int val) {
if(map.containsKey(val)){
return false;
}
nums.add(val);
map.put(val,map.size());
return true;
}
public boolean remove(int val) {
if(!map.containsKey(val)){
return false;
}
int index=map.get(val);
int last=nums.get(nums.size()-1);
map.put(last,index);//给最后一个元素新的索引
Collections.swap(nums,index,nums.size()-1);//交换按索引位置来来交换
nums.remove(nums.size() - 1);
map.remove(val);
return true;
}
public int getRandom() {
int rand=random.nextInt(nums.size());
return nums.get(rand);
}
}