2022-03-27 20:46:41 +08:00
|
|
|
|
<p>给定一个整数 <code>n</code> 和一个 <strong>无重复</strong> 黑名单整数数组 <code>blacklist</code> 。设计一种算法,从 <code>[0, n - 1]</code> 范围内的任意整数中选取一个 <strong>未加入 </strong>黑名单 <code>blacklist</code> 的整数。任何在上述范围内且不在黑名单 <code>blacklist</code> 中的整数都应该有 <strong>同等的可能性</strong> 被返回。</p>
|
|
|
|
|
|
|
|
|
|
<p>优化你的算法,使它最小化调用语言 <strong>内置</strong> 随机函数的次数。</p>
|
|
|
|
|
|
|
|
|
|
<p>实现 <code>Solution</code> 类:</p>
|
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li><code>Solution(int n, int[] blacklist)</code> 初始化整数 <code>n</code> 和被加入黑名单 <code>blacklist</code> 的整数</li>
|
|
|
|
|
<li><code>int pick()</code> 返回一个范围为 <code>[0, n - 1]</code> 且不在黑名单 <code>blacklist</code> 中的随机整数</li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<p> </p>
|
|
|
|
|
|
|
|
|
|
<p><strong>示例 1:</strong></p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
<strong>输入</strong>
|
|
|
|
|
["Solution", "pick", "pick", "pick", "pick", "pick", "pick", "pick"]
|
|
|
|
|
[[7, [2, 3, 5]], [], [], [], [], [], [], []]
|
|
|
|
|
<strong>输出</strong>
|
|
|
|
|
[null, 0, 4, 1, 6, 1, 0, 4]
|
|
|
|
|
|
|
|
|
|
<b>解释
|
|
|
|
|
</b>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
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p> </p>
|
|
|
|
|
|
|
|
|
|
<p><strong>提示:</strong></p>
|
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li><code>1 <= n <= 10<sup>9</sup></code></li>
|
2023-12-09 18:42:21 +08:00
|
|
|
|
<li><code>0 <= blacklist.length <= min(10<sup>5</sup>, n - 1)</code></li>
|
2022-03-27 20:46:41 +08:00
|
|
|
|
<li><code>0 <= blacklist[i] < n</code></li>
|
|
|
|
|
<li><code>blacklist</code> 中所有值都 <strong>不同</strong></li>
|
|
|
|
|
<li> <code>pick</code> 最多被调用 <code>2 * 10<sup>4</sup></code> 次</li>
|
|
|
|
|
</ul>
|