題目
解題思路
這道題的我的主要思路是,先通過累積概率選出各個白名單區間,然後再在白名單區間內生成隨機數。網上也有一些其他更好的解法,比如對黑名單的成員進行映射等等,但思路不是特別直觀,有些解法生成隨機數的概率也並不均勻。
參考代碼
import random
import bisect
class Solution:
def __init__(self, N, blacklist):
self.N = N - 1
self.black = sorted(blacklist)
self.range = []
self.weight = []
self.blacklen = len(self.black)
if self.blacklen:
s = 0
for r in self.black:
if r - s >= 1:
self.range.append([s, r - 1])
s = r + 1
if s < self.N + 1:
self.range.append([s, self.N])
weight = 0
for r in self.range:
weight = weight + r[1] - r[0] + 1
self.weight.append(weight)
def pick(self) -> int:
if self.blacklen:
r = self.range[bisect.bisect_left(
self.weight, random.randint(1, self.weight[-1]))]
return random.randint(r[0], r[1]) if r[1] > r[0] else r[0]
else:
return random.randint(0, self.N)
源碼地址:
https://github.com/jediL/LeetCodeByPython
其它題目:[leetcode題目答案講解彙總(Python版 持續更新)]
(https://www.jianshu.com/p/60b5241ca28e)
ps:如果您有好的建議,歡迎交流 :-D,
也歡迎訪問我的個人博客 苔原帶 (www.tundrazone.com)