其他分享
首页 > 其他分享> > LeetCode[528] 按权重随机选择

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