LeetCode[528] 按权重随机选择
作者:互联网
最近工作中想在GPU上实现一个按权重随机选择的函数,然而想了很久也没有头绪,机智的我上力扣上搜了一下,果然有类似的题目,把别人的解答看懂了那就是我的了233。
老规矩简述一下解题思路,先将所有权重加起来,得到W,然后在[0, W-1]内生成一个随机数,用二分查找法找到该随机数对应的坐标就算成了。代码如下:
class Solution { private: vector<int> sum_v; int sum = 0; public: Solution(vector<int> w) { for (auto i = w.begin(); i != w.end(); ++i) { sum += *i; sum_v.push_back(sum); } } int pickIndex() { int k = rand() % sum; int n = sum_v.size()-1; return search(0, n, k); } int search(int start, int end, int rand) { if (start >= end) return end; int mid = start + ((end-start) >> 1); if (sum_v[mid] == rand) { return mid+1; } else if (sum_v[mid] > rand) { return search(start, mid, rand); } else return search(mid+1, end, rand); } };
标签:rand,end,int,sum,mid,start,随机,528,LeetCode 来源: https://www.cnblogs.com/left4back/p/10493192.html