-
题目:实现RandomizedSet 类:
RandomizedSet() 初始化 RandomizedSet 对象 bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。 bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。 int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。 你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。
-
思路:当插入时,当元素存在时,则直接返回false;当元素不存在时,将元素插入到nums的尾部;
-
当删除时,当元素不存在时,直接返回false;当元素存在时,直接返回删除元素的下标索引,将最后一个元素的索引修改为index,交换元素,删除最后一个元素,删除元素对应的索引值;返回true;
-
当等概率获取一个随机值时,采用随机函数产生一个随机数对nums的size()取模为下标对应的值。
C++代码如下:
class RandomizedSet {
public:
vector<int> nums;
unordered_map<int,int> valToIndex;
RandomizedSet() {
}
bool insert(int val) {
//如果元素存在
if(valToIndex.count(val)){
return false;
}
//如果元素不存在,将元素插入到最后一个
valToIndex[val]=nums.size();
//将val插入到nums尾部
nums.push_back(val);
return true;
}
bool remove(int val) {
//如果元素不存在
if(!valToIndex.count(val)){
return false;
}
//如果元素存在
//先拿到val的索引为index
int index = valToIndex[val];
//将最后一个元素的索引修改为index
valToIndex[nums.back()]=index;
//交换nums[index]和nums.back()
swap(nums[index],nums.back());
//移除nums中最后一个元素
nums.pop_back();
// 删除元素 val 对应的索引
valToIndex.erase(val);
return true;
}
int getRandom() {
return nums[rand()%nums.size()];
}
};