给一个权重的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(); */