给一个权重的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

相关文章:

  • 2022-01-05
  • 2022-12-23
  • 2021-08-06
  • 2021-09-18
  • 2021-10-11
  • 2021-09-17
  • 2021-06-01
  • 2021-06-01
猜你喜欢
  • 2022-12-23
  • 2021-12-25
  • 2022-12-23
  • 2021-11-13
  • 2022-12-23
  • 2022-02-03
  • 2021-06-02
相关资源
相似解决方案