要求时间复杂度为O(1),说明不能使用以往的查找方式来实现这些操作。
哈希表是一种很好用且时间复杂度很低的数据结构,这里使用哈希表存储不同数值在数组中的位置,便于查找,以及后续的删除。删除是将其与数组末尾的元素交换位置,再pop_back。
删除时记得要改变哈希表中的对应关系,不然会造成混乱!
hash.count(key)用于查找是否存在key为该值的pair。
使用count,返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。
使用find,返回的是被查找元素的位置,没有则返回map.end()。
class RandomizedSet {
public:
unordered_map<int,int> hash;
vector<int> ans;
RandomizedSet() {
}
bool insert(int val) {
if(hash.count(val))
{
return false;
}
else
{
hash[val]=ans.size();//存下这个新插入的值的在ans中的位置,便于查找
ans.push_back(val);//存进ans数组里,便于getRandom函数随机返回一个值,而这个值在hash里是作为key而不是value,不方便读取!
return true;
}
}
bool remove(int val) {
if(hash.count(val))
{
int j=hash[val];//找到该项在ans中的位置
ans[j]=ans[ans.size()-1];//和最后一项交换位置,删掉最后一项
//hash表的对应关系记得换!!
hash[ans[ans.size()-1]]=j;
hash.erase(val);//通过key来删除
ans.pop_back();
return true;
}
return false;
}
int getRandom() {
return ans[rand()%ans.size()];
}
};
map以及unordered_map的用法及区别: