博客 / 詳情

返回

leetcode 380. Insert Delete GetRandom 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 。

提示:

  • -231 <= val <= 231 - 1
  • 最多調用 insert、remove 和 getRandom 函數 2 * 105 次
  • 在調用 getRandom 方法時,數據結構中 至少存在一個 元素。

來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/...
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

二、解題思路

這道題有個限制在常數時間範圍內實現插入刪除和獲得隨機數操作,沒有該限制的話直接用一個HashSet就可以搞定。我們利用一個可變list和一個HashMap,其中list用來保存數字,HashMap用來建立每個數字和其在list中的位置之間的映射。重點在於刪除元素的邏輯,如果要刪除的元素不存在返回false,如果存在,先求出該元素在list中的索引,將list中最後一個元素更新到此位置,同時更新該元素中在hashmap的索引,然後list中刪除最後一個元素,hashmap也刪除要刪除的元素 。

三、解題方法

3.1 Java實現

class RandomizedSet {
    List<Integer> nums;
    Map<Integer, Integer> indices;
    Random random;

    public RandomizedSet() {
        nums = new ArrayList<>();
        indices = new HashMap<>();
        random = new Random();
    }

    public boolean insert(int val) {
        if (indices.containsKey(val)) {
            return false;
        }
        // 為什麼不寫成indices.put(val, nums.size());
        int index = nums.size();
        nums.add(val);
        indices.put(val, index);
        return true;
    }

    public boolean remove(int val) {
        if (!indices.containsKey(val)) {
            return false;
        }
        int index = indices.get(val);
        int last = nums.get(nums.size() - 1);
        nums.set(index, last);
        indices.put(last, index);
        nums.remove(nums.size() - 1);
        indices.remove(val);
        return true;
    }

    public int getRandom() {
        return nums.get(random.nextInt(nums.size()));
    }
}

四、總結小記

  • 2022/10/18 今天有點不順哦,倒黴的事一個接着一個,想想好事,想想明天,心裏就舒坦了
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.