528. Random Pick with Weight
https://leetcode.com/problems/random-pick-with-weight/description/
根据给定的weight生成随机数。把weight看作数量,然后直接调用rand()%总数即可。但空间消耗很大,实际上并不需要真的去根据weight生成相应数目的元素,需要的只是每个元素对应的range,然后根据随机出来的数看落在了哪个range。因此用一个数组累加记录下range,二分法找随机选出来元素对应的range上边界。
/*
* @lc app=leetcode id=528 lang=cpp
*
* [528] Random Pick with Weight
*/
// @lc code=start
class Solution {
vector<int> elems;
public:
Solution(vector<int>& w) {
elems.resize(w.size());
for (int i = 0, c = 0; i < w.size(); ++i) {
c += w[i];
elems[i] = c;
}
}
int pickIndex() {
int i = rand() % elems.back();
return upper_bound(elems.begin(), elems.end(), i) - elems.begin();
}
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(w);
* int param_1 = obj->pickIndex();
*/
// @lc code=end
Last updated
Was this helpful?