这个题目的随机性考察的是真好。。。。。。。
不知道后台是怎么测随机性的,不明觉厉,我随机从[0,N),中取三个数字,随机输出都过不了。233333
看了Discuss,根据大佬的思路写了一下(但仍改了一晚上的bug2333
大意就是从[0,N]中取min(N-blacklist.size(),blacklist.size())个数字组成数组ve,若rand()到blacklist中的数字,就从从ve中随机取数字输出,否则直接输出rand()的数。。。(很明显,这样的随机性要大很多,所以后台数据真的强。。。
取min(N-blacklist.size(),blacklist.size())个数字的原因是,若大于blacklist.size()没什么必要,因为blacklist.size()个数字就已经够用了。。。最多只有N-blacklist.size()个数字可选。。。
class Solution {
public:
map<int,int> ans;
set<int> se;
int m;
Solution(int N, vector<int> blacklist) {
ans.clear();
se.clear();
vector<int> ve;
m=N;
int n=blacklist.size();
for(int i=0;i<n;i++){
se.insert(blacklist[i]);
}
int ins=0,j=m-1;
while(ins<n&&j>=0){
while(se.count(j)==1)j--;
if(j>=0){
ve.push_back(j);
ins++;
}
j--;
}
int r=0;
for(int i=0;i<n;i++){
int x=blacklist[i];
ans[x]=ve[r++];
r%=ins;
}
}
int pick() {
int x=rand()%m;
if(ans.count(x)==1){
return ans[x];
}
else{
return x;
}
}
};
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(N, blacklist);
* int param_1 = obj.pick();
*/