528. Random Pick with Weight

这题和497类似,就是497的子集吧。
先取prefixSum, 然后random产生一个数,再做binarySearch
我们产生了随机数之后,要找一个能够cover这个数的矩形。就是矩形的prefixSum一定要比它大。
比如随机数 3,我们一定要找在prefixSum数组里找一个比它大的能盖住它的。

class Solution {
    int[] prefixSum;
    Random random;
    public Solution(int[] w) {
        prefixSum = new int[w.length];
        for (int i = 0; i < w.length; i++) {
            prefixSum[i] = w[i] + (i > 0 ? prefixSum[i - 1] : 0);
        }
        random = new Random();
    }
    
    public int pickIndex() {
        int num = random.nextInt(prefixSum[prefixSum.length - 1]);
        // find the smallest larger;
        int l = 0, r = prefixSum.length - 1;
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (prefixSum[mid] <= num ) {
                l = mid + 1;
            } else {
                r = mid;
            }
        }
        return l;
    }
}

你可能感兴趣的:(528. Random Pick with Weight)