528 random pick with weight

https://leetcode.com/problems/random-pick-with-weight/

class Solution {
    int[] array;
    double[] probs;
    double[] prefixes;
    public Solution(int[] w) {
        array = w;
        int sum = 0;
        for (int num : w) {
            sum += num;
        }
        double prob = 0;
        probs = new double[w.length];
        prefixes = new double[w.length];
        for (int i = 0; i < w.length; i++) {
            probs[i] = (double)w[i] / sum;
            prob += probs[i];
            prefixes[i] = prob;
        }
    }
    
    public int pickIndex() {
        Random random = new Random();
        double val = random.nextDouble();
        int lo = 0;
        int hi = array.length - 1;
        
        while (lo < hi) {
            int mid = lo + (hi - lo) / 2;
            if (prefixes[mid] < val) {
                lo = mid + 1;
            } else {
                hi = mid;
            }
        }
        return lo;
    }
}

/**
 * Your Solution object will be instantiated and called as such:
 * Solution obj = new Solution(w);
 * int param_1 = obj.pickIndex();
 */

tricky的地方在于看出来什么地方用binary search最合适

感觉搜索范围的话用lo + 1 < hi好像不太适合?用lo < hi好像更好一点,感觉核心思想就是下一次搜索需不需要包括mid,而这跟搜索区间的开闭有关系,我们这里两边都是闭区间,因此如果mid处不可能就要排除掉,以及终止条件是左右两边相等,相当于收缩到了一个值

Last updated