# LC528 - Random Pick with Weight ## PrefixSum + Binary Search ```java= class Solution { private Random random; private int[] prefixSum; public Solution(int[] w) { int length = w.length; random = new Random(); // prefixSum[i] = w[0] + ... + w[i - 1] prefixSum = new int[length + 1]; for (int i = 1; i <= length; i++) { prefixSum[i] = prefixSum[i - 1] + w[i - 1]; } } public int pickIndex() { int length = prefixSum.length; int target = random.nextInt(prefixSum[length - 1]) + 1; return smallestLargerThanOrEqualTo(target) - 1; } private int smallestLargerThanOrEqualTo(int target) { if (prefixSum.length == 0) { return -1; } int left = 0; int right = prefixSum.length - 1; while (left + 1 < right) { int middle = left + (right - left) / 2; if (prefixSum[middle] >= target) { right = middle; } else { left = middle; } } if (prefixSum[left] >= target) { return left; } return right; } } /** * Your Solution object will be instantiated and called as such: * Solution obj = new Solution(w); * int param_1 = obj.pickIndex(); */ ```