528. Random Pick with Weight

Posted tobeabetterpig

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了528. Random Pick with Weight相关的知识,希望对你有一定的参考价值。

Given an array w of positive integers, where w[i] describes the weight of index i, write a function pickIndex which randomly picks an index in proportion to its weight.
Note:
1. 1 <= w.length <= 10000
2. 1 <= w[i] <= 10^5
3. pickIndex will be called at most 10000 times.
Example 1:
Input: 
["Solution","pickIndex"]
[[[1]],[]]
Output: [null,0]
Example 2:
Input: 
["Solution","pickIndex","pickIndex","pickIndex","pickIndex","pickIndex"]
[[[1,3]],[],[],[],[],[]]
Output: [null,0,1,1,1,0]
Explanation of Input Syntax:
The input is two lists: the subroutines called and their arguments. Solution‘s constructor has one argument, the array w. pickIndex has no arguments. Arguments are always wrapped with a list, even if there aren‘t any.


https://blog.csdn.net/fuxuemingzhu/article/details/81807215


// In the case w = [1, 99] , your pickIndex() should return index 1 for 99% and index 0 for 1%.
    
//     index 0 has weight 1 
//     index 1 has weight 99 
//     the total weight is 100, so index 0 has 1/100, and index 1 has 99/100
//     we can use bianry search for this problem 
    
    
    

// not my code 

    
    
class Solution {

    List<Integer> psum = new ArrayList<>();
    int tot = 0;
    Random rand = new Random();

    public Solution(int[] w) {
        for (int x : w) {
            tot += x;
            psum.add(tot);
        }
    }

    public int pickIndex() {
        int targ = rand.nextInt(tot);

        int lo = 0;
        int hi = psum.size() - 1;
        while (lo != hi) {
            int mid = (lo + hi) / 2;
            if (targ >= psum.get(mid)) lo = mid + 1;
            else hi = mid;
        }
        return lo;
    }
}  


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

 

以上是关于528. Random Pick with Weight的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 528. Random Pick with Weight

[leetcode]528. Random Pick with Weight按权重挑选索引

LeetCode 528. Random Pick with Weight / 497. Random Point in Non-overlapping Rectangles

leetcode 528 按权重随机选择

398. Random Pick Index随机pick函数

398. Random Pick Index