1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { private final int[] prefixSumArray;
public Solution(int[] w) { this.prefixSumArray = new int[w.length]; prefixSumArray[0] = w[0]; for (int i = 1; i < prefixSumArray.length; i++) { prefixSumArray[i] = prefixSumArray[i - 1] + w[i]; } }
public int pickIndex() { int randomValue = ThreadLocalRandom.current().nextInt(prefixSumArray[prefixSumArray.length - 1]) + 1;
int left = 0, right = prefixSumArray.length - 1; while (left < right) { int mid = (left + right) >>> 1; if (prefixSumArray[mid] < randomValue) { left = mid + 1; } else { right = mid; } }
return left; } }
|
注意前缀和数组中的值为各个权重区间的右边界值,如:nums = [1, 3, 1] 时,prefixSumArray = [1, 4, 5]。
References
528. Random Pick with Weight
剑指 Offer II 071. 按权重生成随机数