刪除的時候,交換最後一個元素與被刪除元素,然後pop最後一個元素。記錄交換元素的新位置,寫入hashmap。
插入查詢map發現存在則不插入,如果不存在則push_back。
刪除查詢map發現不存在則不刪除,如果存在則與最後一位元素交換然後pop。
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()];
}
};