如果在不知道容器大小的情况下等概率得到随机数应用了蓄水池抽样算法,假定默认选中第一个,之后第m 个被选中的概率是1/m
class RandomizedSet {
public:
/** Initialize your data structure here. */
RandomizedSet() {
st.clear();
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
bool insert(int val) {
if(st.find(val)!=st.end())
return false;
st.insert(val);
return true;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
bool remove(int val) {
if(st.find(val)==st.end())
return false;
st.erase(val);
return true;
}
/** Get a random element from the set. */
int getRandom() {
unordered_set<int>::iterator it=st.begin();
int res=*it++;
for(int i=1;it!=st.end();i++,it++)
{
int j=rand()%(i+1);
if(j==0)
res=*it;
}
return res;
}
private:
unordered_set<int> st;
};
/**
* Your RandomizedSet object will be instantiated and called as such:
* RandomizedSet obj = new RandomizedSet();
* bool param_1 = obj.insert(val);
* bool param_2 = obj.remove(val);
* int param_3 = obj.getRandom();
*/