leetcode 528. Random Pick with Weight

给一个权重的vector,让你根据权重的概率返回值,返回的值是这些权重的索引。

比如给你一个[1,2]的权重矩阵,1/3的概率返回0,2/3的概率返回1。

等概率函数random只能等概率的一系列数,所以需要将权重矩阵进行累加,即[1,2]变成[1,3],这样如果你用random生成的等概率数是0,就属于第一个权重;如果生成的等概率数是1、2,就属于第二个等概率数。

可以看到其实就是用二分查找找第一个大于用random生成的数。

 

class Solution {
public:
    Solution(vector<int>& w) {
        sum = w;
        for(int i = 1;i < w.size();i++){
            sum[i] = sum[i-1] + w[i];
        }
    }
    
    int pickIndex() {
        int num = sum[sum.size() - 1];
        int index = random()%num;
        int left = 0,right = sum.size() - 1;
        while(left < right){
            int mid = left + (right - left)/2;
            if(sum[mid] <= index)
                left = mid + 1;
            else
                right = mid;
        }
        return right;
    }

    vector<int> sum;
};

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

 https://www.cnblogs.com/grandyang/p/9784690.html

posted @ 2019-08-04 16:32  有梦就要去实现他  阅读(166)  评论(0编辑  收藏  举报