牵扯到随机性那就得数组了
建立一个动态数组
插入插到末尾
删除的话,交换到末尾删除
比如下图,你要删除元素7
先获取7元素的索引,为3
然后将末尾元素索引改为3
交换两元素
删除
这题需要哈希表配合数组一起来
class RandomizedSet {
public:
// 存储元素的值
vector<int> nums;
// 记录每个元素对应在 nums 中的索引
unordered_map<int,int> valToIndex;
bool insert(int val) {
// 若 val 已存在,不⽤再插⼊
if (valToIndex.count(val)) {
return false;
}
// 若 val 不存在,插⼊到 nums 尾部,
// 并记录 val 对应的索引值
valToIndex[val] = nums.size();
nums.push_back(val);
return true;
}
bool remove(int val) {
// 若 val 不存在,不⽤再删除
if (!valToIndex.count(val)) {
return false;
}
// 先拿到 val 的索引
int index = valToIndex[val];
// 将最后⼀个元素对应的索引修改为 index
valToIndex[nums.back()] = index;
// 交换 val 和最后⼀个元素
swap(nums[index], nums.back());
// 在数组中删除元素 val
nums.pop_back();
// 删除元素 val 对应的索引
valToIndex.erase(val);
return true;
}
int getRandom() {
// 随机获取 nums 中的⼀个元素
return nums[rand() % nums.size()];
}
};