528. Random Pick with Weight
Problem description:
You are given an array of positive integers w
where w[i]
describes the weight of ith
index (0-indexed).
We need to call the function pickIndex()
which randomly returns an integer in the range [0, w.length - 1]
. pickIndex()
should return the integer proportional to its weight in the w
array. For example, for w = [1, 3]
, the probability of picking the index 0
is 1 / (1 + 3) = 0.25
(i.e 25%) while the probability of picking the index 1
is 3 / (1 + 3) = 0.75
(i.e 75%).
More formally, the probability of picking index i
is w[i] / sum(w)
.
Example 1:
1 | Input |
Example 2:
1 | Input |
Constraints:
1 <= w.length <= 10000
1 <= w[i] <= 10^5
pickIndex
will be called at most10000
times.
Solution:
The idea is to create a prefix_sum
array and have a sum
for the total weight.
Then multiply the sum
with random
when picking a number. Do a binary search to find which index has the number that is smaller but closest to the random*sum
1 | class Solution: |
time complexity: $O(n)$ in init
, $O(logn)$ when pickIndex
space complexity: $O(n)$
reference:
related problem: