一、題目大意
實現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 今天有點不順哦,倒黴的事一個接着一個,想想好事,想想明天,心裏就舒坦了