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);
    }
};

 

转载于:https://www.cnblogs.com/left4back/p/10493192.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值