JAVA练习365- O(1) 时间插入、删除和获取随机元素
题目概览实现RandomizedSet类RandomizedSet()初始化RandomizedSet对象bool insert(int val)当元素val不存在时向集合中插入该项并返回true否则返回false。bool remove(int val)当元素val存在时从集合中移除该项并返回true否则返回false。int getRandom()随机返回现有集合中的一项测试用例保证调用此方法时集合中至少存在一个元素。每个元素应该有相同的概率被返回。你必须实现类的所有函数并满足每个函数的平均时间复杂度为O(1)。示例输入[RandomizedSet, insert, remove, insert, getRandom, remove, insert, getRandom] [[], [1], [2], [2], [], [1], [2], []]输出[null, true, false, true, 2, true, false, 2]解释RandomizedSet randomizedSet new RandomizedSet(); randomizedSet.insert(1); // 向集合中插入 1 。返回 true 表示 1 被成功地插入。 randomizedSet.remove(2); // 返回 false 表示集合中不存在 2 。 randomizedSet.insert(2); // 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。 randomizedSet.getRandom(); // getRandom 应随机返回 1 或 2 。 randomizedSet.remove(1); // 从集合中移除 1 返回 true 。集合现在包含 [2] 。 randomizedSet.insert(2); // 2 已在集合中所以返回 false 。 randomizedSet.getRandom(); // 由于 2 是集合中唯一的数字getRandom 总是返回 2 。提示-2^31 val 2^31 - 1最多调用insert、remove和getRandom函数2 *10^5次在调用getRandom方法时数据结构中至少存在一个元素。来源380. O(1) 时间插入、删除和获取随机元素 - 力扣LeetCode解题分析方法哈希插入和删除可以用通过集合来实现由于集合是乱序的因此我们需要一个有序集合来存储每个元素由于这里给出了最多调用 20000 次我们可以用长度为 20000 的数组代替那么维护一个变量 index记录当前数组索引集合用 map 实现key 为 valvalue 为 index插入时插入 mapnums[ index ] valindex删除时删除 map 对应 val 的键值对并记录对应索引 cur将数组对应索引值设置为数组最后一个即 nums[cur] nums[index]然后 index--。随机获取时生成 [ 0i的随机值即可时间复杂度O(1)空间复杂度O(n)class RandomizedSet { static int[] nums new int[200001]; Random random new Random(); MapInteger, Integer map new HashMap(); int i -1; public RandomizedSet() { } public boolean insert(int val) { if (map.containsKey(val)) { return false; } nums[i] val; map.put(val, i); return true; } public boolean remove(int val) { if (!map.containsKey(val)) { return false; } int index map.remove(val); if (index i) { i--; return true; } nums[index] nums[i--]; map.put(nums[index], index); return true; } public int getRandom() { int ran random.nextInt(i1); return nums[ran]; } } /** * Your RandomizedSet object will be instantiated and called as such: * RandomizedSet obj new RandomizedSet(); * boolean param_1 obj.insert(val); * boolean param_2 obj.remove(val); * int param_3 obj.getRandom(); */

相关新闻