LeetCode 528
考虑普通random的时候,每个位置的权重是一样的。那么对于每个weight,我们给一个区间,如果random值在这个区间里面那么就算这个值,那么就算是根据weight来random了。
然后怎么能快速的定位到这个区间呢,如果我们把所有的值按顺序相加。比如,我们有 【1, 2, 5, 3】
那么我们转换为【0, 1, 3, 8, 11】那么两个之间的间隔就是weight,取了random之后,我们可以通过二分法快速查找这个值在那个区间。
class Solution:
def __init__(self, w: List[int]):
self.ws = [0]
for wi in enumerate(w):
self.ws.append(self.ws[-1] + wi)
def pickIndex(self) -> int:
total = self.ws[-1]
rd = random.randint(1, total)
index = bisect.bisect_left(self.ws, rd)
return index -1