Leetcode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复

1.题目基本信息

1.1.题目描述

RandomizedCollection 是一种包含数字集合(可能是重复的)的数据结构。它应该支持插入和删除特定元素,以及删除随机元素。

实现 RandomizedCollection 类:

  • RandomizedCollection()初始化空的 RandomizedCollection 对象。

  • bool insert(int val) 将一个 val 项插入到集合中,即使该项已经存在。如果该项不存在,则返回 true ,否则返回 false 。

  • bool remove(int val) 如果存在,从集合中移除一个 val 项。如果该项存在,则返回 true ,否则返回 false 。注意,如果 val 在集合中出现多次,我们只删除其中一个。

  • int getRandom() 从当前的多个元素集合中返回一个随机元素。每个元素被返回的概率与集合中包含的相同值的数量 线性相关 。

您必须实现类的函数,使每个函数的 平均 时间复杂度为 O(1) 。

注意:生成测试用例时,只有在 RandomizedCollection 中 至少有一项 时,才会调用 getRandom 。

1.2.题目地址

https://leetcode.cn/problems/insert-delete-getrandom-o1-duplicates-allowed/description/

2.解题方法

2.1.解题思路

哈希表。使用数组nums维护所有的元素数组,map1维护各个元素的索引集合

3.解题代码

python代码

from collections import defaultdict

class RandomizedCollection:
    # 思路:哈希表。使用数组nums维护所有的元素数组,map1维护各个元素的索引集合
    def __init__(self):
        self.nums = []
        self.size = 0
        self.map1 = defaultdict(set)

    def insert(self, val: int) -> bool:
        ans = True if len(self.map1[val]) == 0 else False
        self.nums.append(val)
        self.map1[val].add(self.size)
        self.size += 1
        return ans

    def remove(self, val: int) -> bool:
        if len(self.map1[val]) == 0:
            return False
        # 第一步,找到需要val需要交换的索引
        index = self.map1[val].pop()
        # 第二步,如果index==self.size-1,则直接从nums末尾删除
        if index == self.size - 1:
            self.nums.pop()
            self.size -= 1
            return True
        # 第三步,将index处的元素和末尾的元素进行交换,并更新维护变量
        tailVal = self.nums[self.size - 1]
        self.nums[index], self.nums[self.size - 1] = self.nums[self.size - 1], self.nums[index]
        # 第四步,删除末尾元素
        self.nums.pop()
        self.map1[tailVal].remove(self.size - 1)
        self.map1[tailVal].add(index)
        self.size -= 1
        return True

    def getRandom(self) -> int:
        return random.choice(self.nums)


# Your RandomizedCollection object will be instantiated and called as such:
# obj = RandomizedCollection()
# param_1 = obj.insert(val)
# param_2 = obj.remove(val)
# param_3 = obj.getRandom()

4.执行结果

posted @ 2025-07-02 08:13  Geek0070  阅读(12)  评论(0)    收藏  举报