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。
学习要点:
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(); */