LeetCode每日一题——710. 黑名单中的随机数

简介: 优化你的算法,使它最小化调用语言 内置 随机函数的次数。

题目

给定一个整数 n 和一个 无重复 黑名单整数数组 blacklist 。设计一种算法,从 [0, n - 1] 范围内的任意整数中选取一个 未加入 黑名单 blacklist 的整数。任何在上述范围内且不在黑名单 blacklist 中的整数都应该有 同等的可能性 被返回。

优化你的算法,使它最小化调用语言 内置 随机函数的次数。

实现 Solution 类:

  • Solution(int n, int[] blacklist) 初始化整数 n 和被加入黑名单 blacklist 的整数
  • int pick() 返回一个范围为 [0, n - 1] 且不在黑名单 blacklist 中的随机整数

示例

示例 1:

输入 [“Solution”, “pick”, “pick”, “pick”, “pick”, “pick”, “pick”,

“pick”] [[7, [2, 3, 5]], [], [], [], [], [], [], []]

输出 [null, 0, 4,1, 6, 1, 0, 4]

解释 Solution solution = new Solution(7, [2, 3, 5]); solution.pick(); // 返回0,任何[0,1,4,6]的整数

都可以。注意,对于每一个pick的调用,// 0、1、4和6的返回概率必须相等(即概率为1/4).

solution.pick(); // 返回 4 solution.pick(); // 返回 1

solution.pick(); // 返回 6 solution.pick(); // 返回 1 solution.pick(); // 返回 0 solution.pick(); // 返回 4

提示:

1 <= n <= 109

0 <= blacklist.length <= min(105, n - 1)

0 <= blacklist[i] < n

blacklist 中所有值都 不同

pick 最多被调用 2 * 104 次

思路

借鉴了评论区大佬的思路

思路:

  • 黑名单长度为s,我们从[0, N-s)中取随机值,这个随机值有可能在黑名单中,怎么办?
  • [0, N-s)内的元素,如果有i个在黑名单中,那么在[N-s, N)中,必定有i个元素不在黑名单中
  • 对[0, N-s)中的黑名单元素和[N-s, N)中不在黑名单中的元素做映射m,必定可以一一对应,怎么对应倒是无所谓
  • 从[0, N-s)中取随机值r,如果r不在黑名单中,直接返回;如果r在黑名单中,则m[r]一定不在黑名单,返回m[r]

题解

from random import randint
class Solution:
    def __init__(self, N, blacklist):
        """
        :type N: int
        :type blacklist: List[int]
        """
        self.s = N - len(blacklist)
        # 小于s的黑名单元素集合
        b_lt_s = {i for i in blacklist if i < self.s}
        # 大于s的非黑名单元素集合
        # 等价于:w_gt_s = {i for i in range(self.s, N)} - set(blacklist),感谢评论
        w_gt_s = {*range(self.s, N)} - set(blacklist)
        # 做映射,使用zip方便一点
        # 等价于:self.m = {k: v for k,v in zip(b_lt_s, w_gt_s)}
        self.m = dict(zip(b_lt_s, w_gt_s))
    def pick(self):
        """
        :rtype: int
        """
        r = randint(0, self.s-1)
        return r if r not in self.m else self.m[r]
目录
相关文章
|
索引
LeetCode每日一题(9)——随机数索引(理解水塘抽样)
随机数索引 1.题目 2.示例 3.思路及代码
132 0
LeetCode每日一题(9)——随机数索引(理解水塘抽样)
|
存储 索引
LeetCode——398. 随机数索引
LeetCode——398. 随机数索引
99 0
|
索引
LeetCode每日一题——398. 随机数索引
给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。
85 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
61 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
124 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
40 1