528. 按权重随机选择 力扣(中等) 前缀和rand()

528. 按权重随机选择

给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 i 的概率与 w[i] 成正比。

例如,对于 w = [1, 3],挑选下标 0 的概率为 1 / (1 + 3) = 0.25 (即,25%),而选取下标 1 的概率为 3 / (1 + 3) = 0.75(即,75%)。

也就是说,选取下标 i 的概率为 w[i] / sum(w) 。

 

示例 1:

输入:
["Solution","pickIndex"]
[[[1]],[]]
输出:
[null,0]
解释:
Solution solution = new Solution([1]);
solution.pickIndex(); // 返回 0,因为数组中只有一个元素,所以唯一的选择是返回下标 0。

题解:https://leetcode-cn.com/problems/random-pick-with-weight/solution/cer-fen-xiang-jie-by-xiaohu9527-nsns/

学习要点:

vector可以直接用“=”赋值

rand(),它会返回一个从0到最大随机数的任意整数

代码:

class Solution {
public:
    vector<int> sum;
    Solution(vector<int>& w) {
     sum=w;       
     for(int i=1;i<w.size();i++)
       sum[i]+=sum[i-1];   
    }
    
    int pickIndex() {
        int idx=rand() % sum.back()+1;  //  由于w[i]>1
        return lower_bound(sum.begin(),sum.end(),idx)-sum.begin();
    }
};

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

posted on 2021-08-30 19:31  Yxter  阅读(82)  评论(0编辑  收藏  举报

导航