具体思想:
前缀和+二分是最快的;
但是用遍历也可以做,但是要O(n)复杂度;
具体代码:
普通版本:
class Solution {
public:
Solution(vector<int>& w) {
for(auto ele:w){
sum+=ele;
num.push_back(ele);
}
}
int pickIndex() {
int index=rand()%sum;
index+=1;
for(int i=0;i<num.size();i++){
if(index-num[i]<=0){
return i;
}
index-=num[i];
}
return -1;
}
private:
int sum=0;
vector<int>num;
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(w);
* int param_1 = obj->pickIndex();
*/
前缀二分版本:
class Solution {
public:
Solution(vector<int>& w){
num=w;
for(int i=1;i<num.size();i++){
num[i]+=num[i-1];
}
}
int pickIndex() {
int n=rand()%(*num.rbegin())+1;
int l=0,r=num.size()-1;
while(l<r){
int mid=l+(r-l)/2;
if(num[mid]==n){
return mid;
}else if(num[mid]<n){
l=mid+1;
}else{
r=mid;
}
}
return l;
}
private:
vector<int>num;
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(w);
* int param_1 = obj->pickIndex();
*/