黑名单中的随机数-leetcode710
题目描述
给定一个整数 n
和一个 无重复 黑名单整数数组 blacklist
。设计一种算法,从 [0, n - 1]
范围内的任意整数中选取一个 未加入 黑名单 blacklist
的整数。任何在上述范围内且不在黑名单 blacklist
中的整数都应该有 同等的可能性 被返回。
优化你的算法,使它最小化调用语言 内置 随机函数的次数。
实现 Solution
类:
Solution(int n, int[] blacklist)
初始化整数n
和被加入黑名单blacklist
的整数int pick()
返回一个范围为[0, n - 1]
且不在黑名单blacklist
中的随机整数
方法一:黑名单映射
关键点1:等概率随机选择未被列入黑名单的整数——映射策略:将黑名单中的元素映射到白名单中的元素,确保随机数生成范围缩小到[0, bound)
设 blacklist 的长度为 m。所有黑名单数全部在区间 [bound,n) 范围内,可以直接在 [0,bound) 范围内取随机整数。
关键点2:最小化调用内置随机函数的次数——pick()
将 [0,bound) 范围内的黑名单数,映射到 [bound,n) 范围内的白名单数上。每次 pick() 时,仅生成一次随机数x
(范围为[0, bound)
),通过哈希表b2w
直接查询映射值,时间复杂度为 O (1),那么:
如果 x 不在黑名单中,则直接返回 x;
如果 x 在黑名单中,则返回 x 映射到 [bound,n) 范围内的白名单数。
在初始化时,构建一个从 [0,bound) 范围内的黑名单数到 [bound,n) 的白名单数的映射:
关键点3:处理黑名单无重复的特性
将 [bound,n) 范围内的黑名单数存入一个哈希集合 black,使用unordered_set<int>
存储后半部分的黑名单元素,利用集合的唯一性和 O (1) 查找特性,快速判断白名单元素是否可用;
初始化白名单数 bonud=n−m;
对于每个 [0,bound) 范围内的黑名单数 b,首先不断增加 w 直至其不在黑名单中,然后将 b 映射到 w 上,并将 w 增加1。
// C++
class Solution {
//哈希表,用于存储黑名单中的数字(键)到白名单中的数字(值)的映射关系。unordered_map<int, int> b2w;int bound;public:Solution(int n, vector<int> &blacklist) {int m = blacklist.size();bound = n - m;unordered_set<int> black;for (int b: blacklist) {if (b >= bound) {black.emplace(b);}}int w = bound;for (int b: blacklist) {if (b < bound) {while (black.count(w)) {++w;}b2w[b] = w++;}}}int pick() {int x = rand() % bound;return b2w.count(x) ? b2w[x] : x;}
};
代码解释
1. unordered_map
unordered_map
是C++标准模板库(STL)中的一个关联容器,它存储键值对(key-value pairs)。它与map
类似,但它们在内部实现和性能特点上有所不同:
-
内部实现:
unordered_map
是基于哈希表(hash table)实现的,而map
是基于红黑树(一种自平衡二叉搜索树)实现的。 -
性能特点:
-
unordered_map
在查找、插入和删除操作上通常具有更快的平均时间复杂度(接近O(1)),但最坏情况下可能会退化到O(n)(例如当大量键产生哈希冲突时)。 -
map
的查找、插入和删除操作的时间复杂度都是O(log n),因为它基于红黑树,操作时间相对稳定。
-
unordered_map<int, int>
表示这个unordered_map
容器的键(key)和值(value)都是int
类型。
b2w
是这个unordered_map
容器的变量名,可以通过它来访问和操作这个容器,如插入键值对/查找/删除等。
2.vector<int> &blacklist
一个引用到 vector<int>
类型的对象,blacklist
是一个整数数组,存储了某些“黑名单”数字。
3.unordered_set<int> black
-
unordered_set<int>
:声明一个unordered_set
容器,存储int
类型的元素。 -
black
:容器变量名,存储后半部分的黑名单数字。-
unordered_set
是基于哈希表实现的集合容器,存储的元素是唯一的(不允许重复),并且查找、插入和删除操作的平均时间复杂度接近 O(1)。
-
4.black.count(w)
unordered_set
容器的一个成员函数调用,用于检查集合中是否存在某个元素。如果存在(返回值为 1),说明w
不可用,需要继续递增w
。如果不存在(返回值为 0)
5.rand() % bound
得到一个范围在[0, bound)
内的随机数
时间复杂度分析
分为两个部分:初始化阶段和随机选择阶段
1. 初始化阶段的时间复杂度
步骤 1:处理后半部分的黑名单数字
- 遍历一次黑名单,时间复杂度为 O(m),其中
m
是黑名单长度。 unordered_set
的插入操作(emplace
)平均时间复杂度为 O(1)。
步骤 2:建立映射关系
- 外层循环遍历黑名单,时间复杂度为 O(m)。
- 内层
while
循环的总次数 最多为 m 次(后半部分的白名单数字至少有m
个,足够映射前半部分的m
个黑名单数字)。 black.count(w)
的时间复杂度为 O(1)。- 这部分的总时间复杂度为 O(m)。
初始化总时间复杂度:O(m)
2. 随机选择阶段的时间复杂度
- 生成随机数
rand() % bound
的时间复杂度为 O(1)。 b2w.count(x)
和b2w[x]
的哈希表查询操作时间复杂度均为 O(1)。
3. 空间复杂度
unordered_map<int, int> b2w
:最多存储m
个映射关系,空间复杂度为 O(m)。unordered_set<int> black
:最多存储m
个元素,空间复杂度为 O(m)。
执行流程示例
假设:
n = 10
,黑名单为[2, 3, 5, 8]
。bound = 10 - 4 = 6
。- 后半部分的黑名单数字为
[8]
(因为 8 >= 6),存入black
集合。
映射过程:
- 处理
b=2
:- 从
w=6
开始检查。 6
不在black
中,可用,将2
映射到6
,然后w
递增为7
。
- 从
- 处理
b=3
:- 当前
w=7
,7
不在black
中,可用,将3
映射到7
,然后w
递增为8
。
- 当前
- 处理
b=5
:- 当前
w=8
,8
在black
中,不可用,w
递增为9
。 9
不在black
中,可用,将5
映射到9
。
- 当前
相关文章:
黑名单中的随机数-leetcode710
题目描述 给定一个整数 n 和一个 无重复 黑名单整数数组 blacklist 。设计一种算法,从 [0, n - 1] 范围内的任意整数中选取一个 未加入 黑名单 blacklist 的整数。任何在上述范围内且不在黑名单 blacklist 中的整数都应该有 同等的可能性 被返回。 优化你的算法&am…...

纯Java实现反向传播算法:零依赖神经网络实战
在深度学习框架泛滥的今天,理解算法底层实现变得愈发重要。反向传播(Backpropagation)作为神经网络训练的基石算法,其实现往往被各种框架封装。本文将突破常规,仅用Java标准库实现完整BP算法,帮助开发者: 1) 深入理解BP数学原理。2) 掌握面向对象的神经网络实现。3) 构建可…...

海纳思(Hi3798MV300)机顶盒遇到海思摄像头
海纳思机顶盒遇到海思摄像头,正好家里有个海思Hi3516的摄像头模组开发板,结合机顶盒来做个录像。 准备工作 海纳斯机顶盒摄像机模组两根网线、两个电源、路由器一块64G固态硬盘 摄像机模组和机顶盒都接入路由器的LAN口,确保网络正常通信。 …...
MCP项目实例 - client sever交互
1. 项目概述 项目目标 构建一个本地智能舆论分析系统。 利用自然语言处理和多工具协作,实现用户查询意图的自动理解。 进行新闻检索、情绪分析、结构化输出和邮件推送。 系统流程 用户查询:用户输入查询请求。 提取关键词:从用户查询中…...

Axure应用交互设计:表格跟随菜单移动效果(超长表单)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!本文如有帮助请订阅 Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:表格跟随菜单移动 主要内容:表格交互设计、动态面板嵌套、拖动时事件、移动动作 应用场景…...

7系列 之 I/O标准和终端技术
背景 《ug471_7Series_SelectIO.pdf》介绍了Xilinx 7 系列 SelectIO 的输入/输出特性及逻辑资源的相关内容。 第 1 章《SelectIO Resources》介绍了输出驱动器和输入接收器的电气特性,并通过大量实例解析了各类标准接口的实现。 第 2 章《SelectIO Logic Resource…...

github 上的 CI/CD 的尝试
效果 步骤 新建仓库设置仓库的 page 新建一个 vite 的项目,改一下 vite.config.js 中的 base 工作流 在项目的根目录下新建一个 .github/workflows/ci.yml 文件,然后编辑一下内容 name: Build & Deploy Vue 3 Appon:push:branches: [main]permi…...
Scala和Go差异
Scala和Go(又称Golang)是两种现代编程语言,各自具有独特的特性和设计哲学。 尽管它们都可以用于构建高性能、可扩展的应用程序,但在许多方面存在显著差异。 Scala和Go的详细比较,涵盖它们的异同点: 1. 语…...

yup 使用 3 - 利用 meta 实现表单字段与表格列的统一结构配置(适配 React Table)
yup 使用 3 - 利用 meta 实现表单字段与表格列的统一结构配置(适配 React Table) Categories: Tools Last edited time: May 11, 2025 7:45 PM Status: Done Tags: form validation, schema design, yup 本文介绍如何通过 Yup 的 meta() 字段࿰…...
类初始化方法
一、类初始化方法 成员初始化列表 class Point {int x, y; public:Point(int a, int b) : x(a), y(b) {} };就地初始化(C11) 声明时初始化。 class Widget {int size 10; // 类内成员初始化vector<int> data{1,2,3}; };特殊情况:静…...

【OpenCV】imread函数的简单分析
目录 1.imread()1.1 imread()1.2 imread_()1.2.1 查找解码器(findDecoder)1.2.2 读取数据头(JpegDecoder-->readHeader)1.2.2.1 初始化错误信息(jpeg_std_error)1.2.2.2 创建jpeg解压缩对象(…...

【Linux实践系列】:进程间通信:万字详解共享内存实现通信
🔥 本文专栏:Linux Linux实践项目 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 人生就像一场马拉松,重要的不是起点,而是坚持到终点的勇气 ★★★ 本文前置知识: …...

【笔记】BCEWithLogitsLoss
工作原理 BCEWithLogitsLoss 是 PyTorch 中的一个损失函数,用于二分类问题。 它结合了 Sigmoid 激活函数和二元交叉熵(Binary Cross Entropy, BCE)损失在一个类中。 这不仅简化了代码,而且通过数值稳定性优化提高了模型训练的效…...
Oracle SYSTEM/UNDO表空间损坏的处理思路
Oracle SYSTEM/UNDO表空间损坏是比较棘手的故障,通常会导致数据库异常宕机进而无法打开数据库。数据库的打开故障处理起来相对比较麻烦,读者可以参考本书第5章进一步了解该类故障的处理过程。如果数据库没有备份,通常需要设置官方不推荐的隐含…...
为什么 cout<<“中文你好“ 能正常输出中文
一, 简答: 受python3字符串模型影响得出的下文C字符串模型结论 是错的!C的字符串和python2的字符串模型类似,也就是普通的字符串是ASCII字符串和字节串两种语义,类似重载或多态,有时候解释为整数,有时候是字节串。Uni…...
Leetcode 3547. Maximum Sum of Edge Values in a Graph
Leetcode 3547. Maximum Sum of Edge Values in a Graph 1. 解题思路2. 代码实现 题目链接:3547. Maximum Sum of Edge Values in a Graph 1. 解题思路 这一题主要是在问题的分析上面。由题意易知,事实上给定的图必然只可能存在三种可能的结构&#x…...

关于Go语言的开发环境的搭建
1.Go开发环境的搭建 其实对于GO语言的这个开发环境的搭建的过程,类似于java的开发环境搭建,我们都是需要去安装这个开发工具包的,也就是俗称的这个SDK,他是对于我们的程序进行编译的,不然我们写的这个代码也是跑不起来…...

Flutter PIP 插件 ---- 为iOS 重构PipController, Demo界面,更好的体验
接上文 Flutter PIP 插件 ---- 新增PipActivity,Android 11以下支持自动进入PIP Mode 项目地址 PIP, pub.dev也已经同步发布 pip 0.0.3,你的加星和点赞,将是我继续改进最大的动力 在之前的界面设计中,还原动画等体验一…...
Redis 基本命令与操作全面解析:从入门到实战
前言 Redis 作为高性能内存数据库,其丰富的命令体系是发挥强大功能的基础。掌握 Redis 的基本命令,不仅能实现数据的高效读写,还能深入理解其内存模型与工作机制。本文将系统梳理 Redis 的核心命令,涵盖连接操作、键管理、数据类…...

数据库管理-第325期 ADG Failover后该做啥(20250513)
数据库管理325期 2025-05-13 数据库管理-第325期 ADG Failover后该做啥(20250513)1 故障处置2 恢复原主库3 其他操作总结 数据库管理-第325期 ADG Failover后该做啥(20250513) 作者:胖头鱼的鱼缸(尹海文&a…...

SQLi-Labs 第21-24关
Less-21 http://127.0.0.1/sqli-labs/Less-21/ 1,抓个请求包看看 分析分析cookie被base64URL编码了,解码之后就是admin 2,那么这个网站的漏洞利用方式也是和Less-20关一样的,只是攻击语句要先base64编码,再URL编码&…...
Oracle — 数据管理
介绍 Oracle数据库作为全球领先的关系型数据库管理系统,其数据管理能力以高效性、安全性和智能化为核心。系统通过多维度技术实现海量数据的存储与实时处理,支持高并发事务操作与复杂分析查询,满足企业关键业务需求。在安全领域,O…...
在 Qt Creator 中为 QDockWidget 设置隐藏和显示按钮
在 Qt Creator 中为 QDockWidget 设置隐藏和显示按钮 是的,QDockWidget 内置了隐藏和显示的功能,可以通过以下几种方式实现: 1. 使用 QDockWidget 自带的关闭按钮 QDockWidget 默认带有一个关闭按钮,可以通过以下代码启用&…...
LS-NET-012-TCP的交互过程详解
LS-NET-012-TCP的交互过程详解 附加:TCP如何保障数据传输 TCP的交互过程详解 一、TCP协议核心交互流程 TCP协议通过三次握手建立连接、数据传输、四次挥手终止连接三大阶段实现可靠传输。整个过程通过序列号、确认应答、窗口控制等机制保障传输可靠性。 1.1 三次…...
每日算法刷题Day1 5.9:leetcode数组3道题,用时1h
1.LC寻找数组的中心索引(简单) 数组和字符串 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 思想: 计算总和和左侧和,要让左侧和等于右侧和,即左侧和总和-左侧和-当前数字 代码 c代码: class Solution { public:i…...
解构认知边界:论万能方法的本体论批判与方法论重构——基于跨学科视阈的哲学-科学辩证
一、哲学维度的本体论批判 (1)理性主义的坍缩:从笛卡尔幻想到哥德尔陷阱 笛卡尔在《方法论》中构建的理性主义范式,企图通过"普遍怀疑-数学演绎"双重机制确立绝对方法体系。然而哥德尔不完备定理(Gdel, 19…...

PVE WIN10直通无线网卡蓝牙
在 Proxmox VE (PVE) 中直通 Intel AC3165 无线网卡的 **蓝牙模块**(通常属于 USB 设备,而非 PCIe 设备)需要特殊处理,因为它的蓝牙部分通常通过 USB 连接,而 Wi-Fi 部分才是 PCIe 设备。以下是详细步骤: …...

第六节第二部分:抽象类的应用-模板方法设计模式
模板方法设计模式的写法 建议使用final关键字修饰模板方法 总结 代码: People(父类抽象类) package com.Abstract3; public abstract class People {/*设计模板方法设计模式* 1.定义一个模板方法出来*/public final void write(){System.out.println("\t\t\t…...

在另一个省发布抖音作品,IP属地会随之变化吗?
你是否曾有过这样的疑惑:出差旅游时在外地发布了一条抖音视频,评论区突然冒出“IP怎么显示xx省了?”的提问?随着各大社交平台上线“IP属地”功能,用户的地理位置标识成为公开信息,而属地显示的“灵敏性”也…...

卷积神经网络-从零开始构建一个卷积神经网络
目录 一、什么是卷积神经网络CNN 1.1、核心概念 1.2、卷积层 二、什么是卷积计算 2.1、卷积计算的例子: 2.2、点积 2.3、卷积与点积的关系 2.4、Padding(填充) 2.4.1、Padding的主要作用 1、控制输出特征图尺寸 2、保留边缘信息 3. 支持深层网络训练 2.4.2、Str…...