380. O(1) 时间插入、删除和获取随机元素题解
2022.04.13每日一题
LeetCode 题解持续更新中GitHub仓库地址 CSDN博客地址
今天的题目就是考察数据结构的一道题目,要求所有的操作都在
O
(
1
)
O(1)
O(1) 的时间复杂度下进行,那么我们首先想到的就是 HashMap
来进行存储,而后我们又有随机取出一个数字的要求,那么我们可以再创建一个数组,来存储数字,从数组中随机取出一个数字,返回对应的值,那么就清楚了,使用 HashMap
来存储 数组的索引和相应的值,key 为 值,val 为索引,这样 既保证了 题目中给定的 value
值是唯一的,又保证能够在数组中找到对应的值的索引,也方便后续的增加、删除、以及查询
class RandomizedSet {
// 创建 HashMap 来存储对应的 key 以及 val,保证唯一性
unordered_map<int, int> map;
// 创建数组用来存储 题目中 insert 中加入的数字
int nums[200009];
// 创建一个变量,用于记录 数组当前索引
int size = -1;
public:
RandomizedSet() {
map.clear();
size = -1;
srand((unsigned) time(NULL));
}
bool insert(int val) {
// 如果存在了相同的值就返回 false
if (map.count(val)) return false;
size++;
nums[size] = val;
// 更新 map
map[val] = size;
return true;
}
bool remove(int val) {
// 如果 map 中不存在,就直接返回 false
if (!map.count(val)) return false;
// 获取 val 的 索引
int remove = map[val];
map.erase(val);
// 如果 要移除的元素不是数组的末尾就将 map 更新
if (size != remove) map[nums[size]] = remove;
// 将 对应的值更新
nums[remove] = nums[size];
// 并且缩减 当前数组的长度
size--;
return true;
}
int getRandom() {
// 从 nums 数组中 随机取出一个
return nums[rand() % (size + 1)];
}
};
class RandomizedSet {
// 创建 HashMap 来存储对应的 key 以及 val,保证唯一性
private Map<Integer, Integer> map = new HashMap<>();
// 创建数组用来存储 题目中 insert 中加入的数字
private int[] nums = new int[200009];
// 创建一个变量,用于记录 数组当前索引
private int size = -1;
// 随机一个
Random random = new Random();
public RandomizedSet() {
map.clear();
size = -1;
}
public boolean insert(int val) {
// 如果存在了相同的值就返回 false
if (map.containsKey(val)) return false;
size++;
nums[size] = val;
// 更新 map
map.put(val, size);
return true;
}
public boolean remove(int val) {
// 如果 map 中不存在,就直接返回 false
if (!map.containsKey(val)) return false;
// 获取 val 的 索引
Integer remove = map.remove(val);
// 如果 要移除的元素不是数组的末尾就将 map 更新
if (size != remove) map.put(nums[size], remove);
// 将 对应的值更新
nums[remove] = nums[size];
// 并且缩减 当前数组的长度
size--;
return true;
}
public int getRandom() {
// 从 nums 数组中 随机取出一个
return nums[random.nextInt(size + 1)];
}
}