2021.6.10

设计一个数据结构,能在O(1)时间内等概率随机返回[0, N)区间内不在黑名单blacklist中的整数。通过调整数组顺序并使用哈希表辅助,实现高效查找和删除黑名单元素。" 70678796,284201,使用thinkphp与AjaxFileUpload实现异步图片上传,"['前端开发', 'PHP', 'jQuery', '图片上传', 'Ajax']
摘要由CSDN通过智能技术生成

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(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值