O(1)的时间,删除/查找数组中的任意元素:避开黑名单的随机数
给你输入一个正整数 N,代表左闭右开区间 [0,N),再给你输入一个数组 blacklist,其中包含一些「黑名单数字」,且 blacklist 中的数字都是区间 [0,N) 中的数字。
现在要求你设计如下数据结构:
class Solution {
public:
// 构造函数,输入参数
Solution(int N, vector<int>& blacklist) {
}
// 在区间 [0,N) 中等概率随机选取一个元素并返回
// 这个元素不能是 blacklist 中的元素
int pick() {
}
};
pick
函数会被多次调用,每次调用都要在区间[0,N)
中「等概率随机」返回一个「不在blacklist
中」的整数。
这应该不难理解吧,比如给你输入 N = 5, blacklist = [1,3]
,那么多次调用pick
函数,会等概率随机返回 0, 2, 4 中的某一个数字。
而且题目要求,在 pick
函数中应该尽可能少调用随机数生成函数rand()
。
这句话什么意思呢,比如说我们可能想出如下拍脑袋的解法:
int pick(