leetcode 864. Random Pick with Blacklist

这个题目的随机性考察的是真好。。。。。。。

不知道后台是怎么测随机性的,不明觉厉,我随机从[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();
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值