有这么一道算法题,给定N=7,数组{2,3,5},则从0-6中,除了2,3,5外,等概率取出其他的值,比如取出0的概率是1/4,这个还是有一些应用场景的,在用户已经拥有的东西外,等概率取出其他的东西。
可以用一种哈希映射,假定数组A的长度为m,把0~n-m-1的已经在黑名单的数值映射到n-m到n去,我们只在0到n-m-1取值,这时就是等概率了
class Solution {
public:
map<int,int>vis;
int length;
Solution(int n, vector<int>& blacklist) {
length = n-blacklist.size();
sort(blacklist.begin(),blacklist.end());
for(int i=0;i<blacklist.size();i++)
{
vis[blacklist[i]]=1;
}
int k=length;
for(int i=0;i<blacklist.size();i++)
{
if (blacklist[i]<length)
{
while(vis[k])
k++;
vis[blacklist[i]]=k++;
} else break;
}
}
int pick() {//取值
int n= rand()%length;
if (vis[n]>1)
return vis[n];
return n;
}
};