Files
2020-08-07 17:06:53 +08:00

86 lines
2.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# [710. Random Pick with Blacklist](https://leetcode.com/problems/random-pick-with-blacklist/)
## 题目
Given a blacklist B containing unique integers from [0, N), write a function to return a uniform random integer from [0, N) which is NOT in B.
Optimize it such that it minimizes the call to systems Math.random().
Note:
1. 1 <= N <= 1000000000
2. 0 <= B.length < min(100000, N)
3. [0, N) does NOT include N. See interval notation.
Example 1:
```c
Input:
["Solution","pick","pick","pick"]
[[1,[]],[],[],[]]
Output: [null,0,0,0]
```
Example 2:
```c
Input:
["Solution","pick","pick","pick"]
[[2,[]],[],[],[]]
Output: [null,1,1,1]
```
Example 3:
```c
Input:
["Solution","pick","pick","pick"]
[[3,[1]],[],[],[]]
Output: [null,0,0,2]
```
Example 4:
```c
Input:
["Solution","pick","pick","pick"]
[[4,[2]],[],[],[]]
Output: [null,1,3,1]
```
Explanation of Input Syntax:
The input is two lists: the subroutines called and their arguments. Solution's constructor has two arguments, N and the blacklist B. pick has no arguments. Arguments are always wrapped with a list, even if there aren't any.
## 题目大意
给一个数字 N再给一个黑名单 B要求在 [0,N) 区间内随机输出一个数字这个是不在黑名单 B 中的任意一个数字
## 解题思路
这道题的 N 的范围特别大最大是 10 亿如果利用桶计数开不出来这么大的数组考虑到题目要求我们输出的数字是随机的所以不需要存下所有的白名单的数字
假设 N=10, blacklist=[3, 5, 8, 9]
![](https://s3-lc-upload.s3.amazonaws.com/users/cafebaby/image_1530657902.png)
这一题有点类似 hash 冲突的意思如果随机访问一个数这个数正好在黑名单之内那么就 hash 冲突了我们就把它映射到另外一个不在黑名单里面的数中如上图我们可以将 35 重新映射到 76 的位置这样末尾开始的几个数要么是黑名单里面的数要么就是映射的数字
hash 表总长度应该为 M = N - len(backlist)然后在 M 的长度中扫描是否有在黑名单中的数如果有就代表 hash 冲突了冲突就把这个数字映射到 (M,N) 这个区间范围内为了提高效率可以选择这个区间的头部或者尾部开始映射我选择的是末尾开始映射 (M,N) 这个区间的末尾开始往前找找黑名单不存在的数找到了就把 [0,M] 区间内冲突的数字映射到这里来最后 pick 的时候只需要查看 map 中是否存在映射关系如果存在就输出 map 中映射之后的值如果没有就代表没有冲突直接输出那个 index 即可