Python | Leetcode Python题解之第381题O(1)时间插入、删除和获取随机元素-允许重复

题目:

题解:

import random
class RandomizedCollection:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.table = {}
        self.ns = []

    def insert(self, val: int) -> bool:
        """
        Inserts a value to the collection. Returns true if the collection did not already contain the specified element.
        """
        flag = val not in self.table
        if flag: self.table[val] = {len(self.ns),}
        else: self.table[val].add(len(self.ns))
        self.ns.append(val)
        return flag
        


    def remove(self, val: int) -> bool:
        """
        Removes a value from the collection. Returns true if the collection contained the specified element.
        """
        flag = val in self.table
        if flag:
            last_idx = len(self.ns)-1
            v = self.ns[last_idx]
            index = self.table[val].pop()
            self.ns[index] = self.ns[last_idx]
            if last_idx != index:  # 如果只是最后一位的话,直接删除就好了
                self.table[v].remove(last_idx)
                self.table[v].add(index)
            if not len(self.table[val]): self.table.pop(val)

            self.ns.pop()
        return flag


    def getRandom(self) -> int:
        """
        Get a random element from the collection.
        """
        return random.choice(self.ns)



# 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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值