实现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
  • 最多调用insertremovegetRandom函数2 * 10^5
  • 在调用getRandom方法时,数据结构中至少存在一个元素。

Python:

import random
class RandomizedSet:

    def __init__(self):
        self.arr = []
        self.adict = {}
        self.num = 0
    def insert(self, val: int) -> bool:
        if val not in self.adict.keys():
            if len(self.arr) <= self.num:
                self.arr.append(val)
            else:
                self.arr[self.num] = val
            self.adict[val] = self.num
            self.num += 1
            return True
        else:
            return False

    def remove(self, val: int) -> bool:
        if val not in self.adict.keys():
            return False
        else:
            index = self.adict[val]
            value = self.arr[self.num-1]
            self.arr[index] = value
            self.adict[value] = index
            del self.adict[val]
            self.num -= 1
            return True

    def getRandom(self) -> int:
        index = random.randrange(0, self.num)
        return self.arr[index]

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

Java:

// import java.util.Random;
class RandomizedSet {
    private ArrayList<Integer> arr;
    private HashMap<Integer, Integer> mapping;
    private Random random;

    public RandomizedSet() {
        arr = new ArrayList<>();
        mapping = new HashMap<>();
        random = new Random();
    }

    public boolean insert(int val) {
        if(mapping.containsKey(val))
        {
            return false;
        }
        else
        {
            arr.add(val);
            mapping.put(val, arr.size()-1);
            return true;
        }

    }

    public boolean remove(int val) {
        if(!mapping.containsKey(val))
        {
            return false;
        }
        else
        {
            int index = mapping.get(val);
            int value = arr.get(arr.size()-1);
            arr.set(index, value);
            arr.remove(arr.size()-1);
            mapping.put(value, index);
            mapping.remove(val);
            return true;
        }

    }

    public int getRandom() {
        int index = random.nextInt(arr.size());
        return arr.get(index);
    }
}

/**
 * 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();
 */
最后修改日期: 2022年4月15日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。